Merge branch 'master' of ../opensim-diva/ into inventory-connector

arthursv
Melanie 2009-08-15 19:00:56 +01:00
commit 973be65945
37 changed files with 1048 additions and 1405 deletions

View File

@ -747,7 +747,7 @@ namespace OpenSim.Framework.Communications.Cache
InventoryItemBase itemInfo = null; InventoryItemBase itemInfo = null;
itemInfo = m_InventoryService.QueryItem(item); itemInfo = m_InventoryService.GetItem(item);
if (itemInfo != null) if (itemInfo != null)
{ {
@ -784,7 +784,7 @@ namespace OpenSim.Framework.Communications.Cache
InventoryFolderBase folderInfo = null; InventoryFolderBase folderInfo = null;
folderInfo = m_InventoryService.QueryFolder(folder); folderInfo = m_InventoryService.GetFolder(folder);
if (folderInfo != null) if (folderInfo != null)
{ {

View File

@ -186,14 +186,14 @@ namespace OpenSim.Framework.Communications.Tests
Assert.That( Assert.That(
userInfo.CreateFolder("testFolder1", folderId, (ushort)AssetType.Animation, missingFolderId), Is.False); userInfo.CreateFolder("testFolder1", folderId, (ushort)AssetType.Animation, missingFolderId), Is.False);
Assert.That(myScene.InventoryService.QueryFolder(myFolder), Is.Null); Assert.That(myScene.InventoryService.GetFolder(myFolder), Is.Null);
Assert.That(userInfo.RootFolder.ContainsChildFolder(missingFolderId), Is.False); Assert.That(userInfo.RootFolder.ContainsChildFolder(missingFolderId), Is.False);
Assert.That(userInfo.RootFolder.FindFolder(folderId), Is.Null); Assert.That(userInfo.RootFolder.FindFolder(folderId), Is.Null);
// 2: Try a folder create that should work // 2: Try a folder create that should work
Assert.That( Assert.That(
userInfo.CreateFolder("testFolder2", folderId, (ushort)AssetType.Animation, userInfo.RootFolder.ID), Is.True); userInfo.CreateFolder("testFolder2", folderId, (ushort)AssetType.Animation, userInfo.RootFolder.ID), Is.True);
Assert.That(myScene.InventoryService.QueryFolder(myFolder), Is.Not.Null); Assert.That(myScene.InventoryService.GetFolder(myFolder), Is.Not.Null);
Assert.That(userInfo.RootFolder.ContainsChildFolder(folderId), Is.True); Assert.That(userInfo.RootFolder.ContainsChildFolder(folderId), Is.True);
} }
@ -228,7 +228,7 @@ namespace OpenSim.Framework.Communications.Tests
Assert.That(newFolderName1, Is.EqualTo(folder1.Name)); Assert.That(newFolderName1, Is.EqualTo(folder1.Name));
Assert.That(folderType1, Is.EqualTo((ushort)folder1.Type)); Assert.That(folderType1, Is.EqualTo((ushort)folder1.Type));
InventoryFolderBase dataFolder1 = myScene.InventoryService.QueryFolder(myFolder); InventoryFolderBase dataFolder1 = myScene.InventoryService.GetFolder(myFolder);
Assert.That(newFolderName1, Is.EqualTo(dataFolder1.Name)); Assert.That(newFolderName1, Is.EqualTo(dataFolder1.Name));
Assert.That(folderType1, Is.EqualTo((ushort)dataFolder1.Type)); Assert.That(folderType1, Is.EqualTo((ushort)dataFolder1.Type));
} }
@ -254,7 +254,7 @@ namespace OpenSim.Framework.Communications.Tests
Assert.That(folder2.ContainsChildFolder(folder1Id), Is.True); Assert.That(folder2.ContainsChildFolder(folder1Id), Is.True);
Assert.That(rootFolder.ContainsChildFolder(folder1Id), Is.False); Assert.That(rootFolder.ContainsChildFolder(folder1Id), Is.False);
InventoryFolderBase dataFolder1 = myScene.InventoryService.QueryFolder(myFolder2); InventoryFolderBase dataFolder1 = myScene.InventoryService.GetFolder(myFolder2);
Assert.That(newFolderName2, Is.EqualTo(dataFolder1.Name)); Assert.That(newFolderName2, Is.EqualTo(dataFolder1.Name));
Assert.That(folderType2, Is.EqualTo((ushort)dataFolder1.Type)); Assert.That(folderType2, Is.EqualTo((ushort)dataFolder1.Type));
Assert.That(folder2Id, Is.EqualTo(dataFolder1.ParentID)); Assert.That(folder2Id, Is.EqualTo(dataFolder1.ParentID));
@ -296,7 +296,7 @@ namespace OpenSim.Framework.Communications.Tests
InventoryFolderBase myFolder = new InventoryFolderBase(); InventoryFolderBase myFolder = new InventoryFolderBase();
myFolder.ID = folderToMoveId; myFolder.ID = folderToMoveId;
Assert.That(folder2.ContainsChildFolder(folderToMoveId), Is.True); Assert.That(folder2.ContainsChildFolder(folderToMoveId), Is.True);
Assert.That(myScene.InventoryService.QueryFolder(myFolder).ParentID, Is.EqualTo(folder2Id)); Assert.That(myScene.InventoryService.GetFolder(myFolder).ParentID, Is.EqualTo(folder2Id));
Assert.That(folder1.ContainsChildFolder(folderToMoveId), Is.False); Assert.That(folder1.ContainsChildFolder(folderToMoveId), Is.False);
} }
@ -322,13 +322,13 @@ namespace OpenSim.Framework.Communications.Tests
myFolder.ID = folder1Id; myFolder.ID = folder1Id;
userInfo.CreateFolder("folder1", folder1Id, (ushort)AssetType.Animation, rootFolder.ID); userInfo.CreateFolder("folder1", folder1Id, (ushort)AssetType.Animation, rootFolder.ID);
Assert.That(myScene.InventoryService.QueryFolder(myFolder), Is.Not.Null); Assert.That(myScene.InventoryService.GetFolder(myFolder), Is.Not.Null);
// Test purge // Test purge
userInfo.PurgeFolder(rootFolder.ID); userInfo.PurgeFolder(rootFolder.ID);
Assert.That(rootFolder.RequestListOfFolders(), Is.Empty); Assert.That(rootFolder.RequestListOfFolders(), Is.Empty);
Assert.That(myScene.InventoryService.QueryFolder(myFolder), Is.Null); Assert.That(myScene.InventoryService.GetFolder(myFolder), Is.Null);
} }
} }
} }

View File

@ -552,12 +552,12 @@ namespace OpenSim.Framework.Communications.Tests
return false; return false;
} }
public InventoryItemBase QueryItem(InventoryItemBase item) public InventoryItemBase GetItem(InventoryItemBase item)
{ {
return null; return null;
} }
public InventoryFolderBase QueryFolder(InventoryFolderBase folder) public InventoryFolderBase GetFolder(InventoryFolderBase folder)
{ {
return null; return null;
} }
@ -575,5 +575,10 @@ namespace OpenSim.Framework.Communications.Tests
root.ParentID = UUID.Zero; root.ParentID = UUID.Zero;
return root; return root;
} }
public int GetAssetPermissions(UUID userID, UUID assetID)
{
return 1;
}
} }
} }

View File

@ -355,6 +355,15 @@ namespace OpenSim.Framework
} }
protected int m_creationDate = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; protected int m_creationDate = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
public InventoryItemBase()
{
}
public InventoryItemBase(UUID id)
{
ID = id;
}
public object Clone() public object Clone()
{ {
return MemberwiseClone(); return MemberwiseClone();

View File

@ -2156,16 +2156,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
protected void SendBulkUpdateInventoryFolder(InventoryFolderBase folderBase) protected void SendBulkUpdateInventoryFolder(InventoryFolderBase folderBase)
{ {
// XXX: Nasty temporary move that will be resolved shortly
InventoryFolderImpl folder = (InventoryFolderImpl)folderBase;
// We will use the same transaction id for all the separate packets to be sent out in this update. // We will use the same transaction id for all the separate packets to be sent out in this update.
UUID transactionId = UUID.Random(); UUID transactionId = UUID.Random();
List<BulkUpdateInventoryPacket.FolderDataBlock> folderDataBlocks List<BulkUpdateInventoryPacket.FolderDataBlock> folderDataBlocks
= new List<BulkUpdateInventoryPacket.FolderDataBlock>(); = new List<BulkUpdateInventoryPacket.FolderDataBlock>();
SendBulkUpdateInventoryFolderRecursive(folder, ref folderDataBlocks, transactionId); SendBulkUpdateInventoryFolderRecursive(folderBase, ref folderDataBlocks, transactionId);
if (folderDataBlocks.Count > 0) if (folderDataBlocks.Count > 0)
{ {
@ -2191,17 +2188,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// <param name="folderDataBlocks"></param> /// <param name="folderDataBlocks"></param>
/// <param name="transactionId"></param> /// <param name="transactionId"></param>
private void SendBulkUpdateInventoryFolderRecursive( private void SendBulkUpdateInventoryFolderRecursive(
InventoryFolderImpl folder, ref List<BulkUpdateInventoryPacket.FolderDataBlock> folderDataBlocks, InventoryFolderBase folder, ref List<BulkUpdateInventoryPacket.FolderDataBlock> folderDataBlocks,
UUID transactionId) UUID transactionId)
{ {
folderDataBlocks.Add(GenerateBulkUpdateFolderDataBlock(folder)); folderDataBlocks.Add(GenerateBulkUpdateFolderDataBlock(folder));
const int MAX_ITEMS_PER_PACKET = 5; const int MAX_ITEMS_PER_PACKET = 5;
IInventoryService invService = m_scene.RequestModuleInterface<IInventoryService>();
// If there are any items then we have to start sending them off in this packet - the next folder will have // If there are any items then we have to start sending them off in this packet - the next folder will have
// to be in its own bulk update packet. Also, we can only fit 5 items in a packet (at least this was the limit // to be in its own bulk update packet. Also, we can only fit 5 items in a packet (at least this was the limit
// being used on the Linden grid at 20081203). // being used on the Linden grid at 20081203).
List<InventoryItemBase> items = folder.RequestListOfItems(); InventoryCollection contents = invService.GetFolderContent(AgentId, folder.ID); // folder.RequestListOfItems();
List<InventoryItemBase> items = contents.Items;
while (items.Count > 0) while (items.Count > 0)
{ {
BulkUpdateInventoryPacket bulkUpdate BulkUpdateInventoryPacket bulkUpdate
@ -2233,8 +2232,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
folderDataBlocks.Add(GenerateBulkUpdateFolderDataBlock(folder)); folderDataBlocks.Add(GenerateBulkUpdateFolderDataBlock(folder));
} }
List<InventoryFolderImpl> subFolders = folder.RequestListOfFolderImpls(); List<InventoryFolderBase> subFolders = contents.Folders;
foreach (InventoryFolderImpl subFolder in subFolders) foreach (InventoryFolderBase subFolder in subFolders)
{ {
SendBulkUpdateInventoryFolderRecursive(subFolder, ref folderDataBlocks, transactionId); SendBulkUpdateInventoryFolderRecursive(subFolder, ref folderDataBlocks, transactionId);
} }
@ -6609,20 +6608,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
} }
else // Agent else // Agent
{ {
CachedUserInfo userInfo = ((Scene)m_scene).CommsManager.UserProfileCacheService.GetUserDetails(AgentId); //InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(itemID);
if (userInfo == null) IInventoryService invService = m_scene.RequestModuleInterface<IInventoryService>();
{ InventoryItemBase assetRequestItem = invService.GetItem(new InventoryItemBase(itemID));
m_log.ErrorFormat(
"[CLIENT]: Could not resolve user {0} for caps inventory update",
AgentId);
break;
}
if (userInfo.RootFolder == null)
break;
InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(itemID);
if (assetRequestItem == null) if (assetRequestItem == null)
{ {
assetRequestItem = ((Scene)m_scene).CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID); assetRequestItem = ((Scene)m_scene).CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID);

View File

@ -191,11 +191,6 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
InventoryItemBase item) InventoryItemBase item)
{ {
if (XferUploaders.ContainsKey(transactionID)) if (XferUploaders.ContainsKey(transactionID))
{
CachedUserInfo userInfo = Manager.MyScene.CommsManager.UserProfileCacheService.GetUserDetails(
remoteClient.AgentId);
if (userInfo != null)
{ {
UUID assetID = UUID.Combine(transactionID, remoteClient.SecureSessionId); UUID assetID = UUID.Combine(transactionID, remoteClient.SecureSessionId);
@ -218,14 +213,8 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
Manager.MyScene.AssetService.Store(asset); Manager.MyScene.AssetService.Store(asset);
} }
userInfo.UpdateItem(item); IInventoryService invService = Manager.MyScene.InventoryService;
} invService.UpdateItem(item);
else
{
m_log.ErrorFormat(
"[ASSET TRANSACTIONS]: Could not find user {0} for inventory item update",
remoteClient.AgentId);
}
} }
} }
} }

View File

@ -32,6 +32,7 @@ using log4net;
using OpenMetaverse; using OpenMetaverse;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Communications.Cache;
using OpenSim.Services.Interfaces;
namespace OpenSim.Region.CoreModules.Agent.AssetTransaction namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
{ {
@ -214,12 +215,9 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
private void DoCreateItem(uint callbackID) private void DoCreateItem(uint callbackID)
{ {
m_userTransactions.Manager.MyScene.AssetService.Store(m_asset); m_userTransactions.Manager.MyScene.AssetService.Store(m_asset);
CachedUserInfo userInfo =
m_userTransactions.Manager.MyScene.CommsManager.UserProfileCacheService.GetUserDetails(
ourClient.AgentId);
if (userInfo != null) IInventoryService invService = m_userTransactions.Manager.MyScene.InventoryService;
{
InventoryItemBase item = new InventoryItemBase(); InventoryItemBase item = new InventoryItemBase();
item.Owner = ourClient.AgentId; item.Owner = ourClient.AgentId;
item.CreatorId = ourClient.AgentId.ToString(); item.CreatorId = ourClient.AgentId.ToString();
@ -238,15 +236,10 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
item.Flags = (uint) wearableType; item.Flags = (uint) wearableType;
item.CreationDate = Util.UnixTimeSinceEpoch(); item.CreationDate = Util.UnixTimeSinceEpoch();
userInfo.AddItem(item); if (invService.AddItem(item))
ourClient.SendInventoryItemCreateUpdate(item, callbackID); ourClient.SendInventoryItemCreateUpdate(item, callbackID);
}
else else
{ ourClient.SendAlertMessage("Unable to create inventory item");
m_log.ErrorFormat(
"[ASSET TRANSACTIONS]: Could not find user {0} for inventory item creation",
ourClient.AgentId);
}
} }
/// <summary> /// <summary>

View File

@ -37,6 +37,7 @@ using OpenSim.Framework.Communications.Cache;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
using BlockingQueue = OpenSim.Framework.BlockingQueue<OpenSim.Region.Framework.Interfaces.ITextureSender>; using BlockingQueue = OpenSim.Framework.BlockingQueue<OpenSim.Region.Framework.Interfaces.ITextureSender>;
using OpenSim.Services.Interfaces;
namespace OpenSim.Region.CoreModules.Agent.TextureDownload namespace OpenSim.Region.CoreModules.Agent.TextureDownload
{ {
@ -217,11 +218,16 @@ namespace OpenSim.Region.CoreModules.Agent.TextureDownload
if (profile == null) // Deny unknown user if (profile == null) // Deny unknown user
return; return;
if (profile.RootFolder == null) // Deny no inventory IInventoryService invService = scene.InventoryService;
if (invService.GetRootFolder(client.AgentId) == null) // Deny no inventory
return; return;
if (profile.UserProfile.GodLevel < 200 && profile.RootFolder.FindAsset(e.RequestedAssetID) == null) // Deny if not owned // Diva 2009-08-13: this test doesn't make any sense to many devs
return; //if (profile.UserProfile.GodLevel < 200 && profile.RootFolder.FindAsset(e.RequestedAssetID) == null) // Deny if not owned
//{
// m_log.WarnFormat("[TEXTURE]: user {0} doesn't have permissions to texture {1}");
// return;
//}
m_log.Debug("Texture preview"); m_log.Debug("Texture preview");
} }

View File

@ -34,6 +34,7 @@ using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Communications.Cache;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Interfaces;
namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
{ {
@ -115,9 +116,11 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
} }
public void SetAppearanceAssets(CachedUserInfo profile, ref AvatarAppearance appearance) public void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance)
{ {
if (profile.RootFolder != null) IInventoryService invService = m_scene.InventoryService;
if (invService.GetRootFolder(userID) != null)
{ {
for (int i = 0; i < 13; i++) for (int i = 0; i < 13; i++)
{ {
@ -127,7 +130,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
} }
else else
{ {
InventoryItemBase baseItem = profile.RootFolder.FindItem(appearance.Wearables[i].ItemID); InventoryItemBase baseItem = invService.GetItem(new InventoryItemBase(appearance.Wearables[i].ItemID));
if (baseItem != null) if (baseItem != null)
{ {
@ -143,7 +146,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
} }
else else
{ {
m_log.Error("[APPEARANCE]: you have no inventory, appearance stuff isn't going to work"); m_log.WarnFormat("[APPEARANCE]: user {0} has no inventory, appearance isn't going to work", userID);
} }
} }
@ -163,8 +166,6 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
return; return;
} }
CachedUserInfo profile = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(clientView.AgentId);
AvatarAppearance avatAppearance = null; AvatarAppearance avatAppearance = null;
if (!TryGetAvatarAppearance(clientView.AgentId, out avatAppearance)) if (!TryGetAvatarAppearance(clientView.AgentId, out avatAppearance))
{ {
@ -174,10 +175,6 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
//m_log.DebugFormat("[APPEARANCE]: Received wearables for {0}", clientView.Name); //m_log.DebugFormat("[APPEARANCE]: Received wearables for {0}", clientView.Name);
if (profile != null)
{
if (profile.RootFolder != null)
{
foreach (AvatarWearingArgs.Wearable wear in e.NowWearing) foreach (AvatarWearingArgs.Wearable wear in e.NowWearing)
{ {
if (wear.Type < 13) if (wear.Type < 13)
@ -186,23 +183,11 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
} }
} }
SetAppearanceAssets(profile, ref avatAppearance); SetAppearanceAssets(avatar.UUID, ref avatAppearance);
m_scene.CommsManager.AvatarService.UpdateUserAppearance(clientView.AgentId, avatAppearance); m_scene.CommsManager.AvatarService.UpdateUserAppearance(clientView.AgentId, avatAppearance);
avatar.Appearance = avatAppearance; avatar.Appearance = avatAppearance;
} }
else
{
m_log.WarnFormat(
"[APPEARANCE]: Inventory has not yet been received for {0}, cannot set wearables",
clientView.Name);
}
}
else
{
m_log.WarnFormat("[APPEARANCE]: Cannot set wearables for {0}, no user profile found", clientView.Name);
}
}
public static void GetDefaultAvatarAppearance(out AvatarWearable[] wearables, out byte[] visualParams) public static void GetDefaultAvatarAppearance(out AvatarWearable[] wearables, out byte[] visualParams)
{ {

View File

@ -39,6 +39,7 @@ using OpenSim.Framework.Communications;
using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Communications.Cache;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Interfaces;
namespace OpenSim.Region.CoreModules.Avatar.Friends namespace OpenSim.Region.CoreModules.Avatar.Friends
{ {
@ -654,8 +655,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
initiator.ControllingClient.SendAgentOnline(new UUID[] { fromAgentID }); initiator.ControllingClient.SendAgentOnline(new UUID[] { fromAgentID });
// find the folder for the friend... // find the folder for the friend...
InventoryFolderImpl folder = //InventoryFolderImpl folder =
initiator.Scene.CommsManager.UserProfileCacheService.GetUserDetails(toAgentID).FindFolderForType((int)InventoryType.CallingCard); // initiator.Scene.CommsManager.UserProfileCacheService.GetUserDetails(toAgentID).FindFolderForType((int)InventoryType.CallingCard);
IInventoryService invService = initiator.Scene.InventoryService;
InventoryFolderBase folder = invService.GetFolderForType(toAgentID, AssetType.CallingCard);
if (folder != null) if (folder != null)
{ {
// ... and add the calling card // ... and add the calling card

View File

@ -33,6 +33,7 @@ using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Communications.Cache;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Interfaces;
namespace OpenSim.Region.CoreModules.Avatar.Gestures namespace OpenSim.Region.CoreModules.Avatar.Gestures
{ {
@ -62,42 +63,32 @@ namespace OpenSim.Region.CoreModules.Avatar.Gestures
public virtual void ActivateGesture(IClientAPI client, UUID assetId, UUID gestureId) public virtual void ActivateGesture(IClientAPI client, UUID assetId, UUID gestureId)
{ {
CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(client.AgentId); IInventoryService invService = m_scene.InventoryService;
if (userInfo != null) InventoryItemBase item = invService.GetItem(new InventoryItemBase(gestureId));
{
InventoryItemBase item = userInfo.RootFolder.FindItem(gestureId);
if (item != null) if (item != null)
{ {
item.Flags = 1; item.Flags = 1;
userInfo.UpdateItem(item); invService.UpdateItem(item);
} }
else else
m_log.ErrorFormat( m_log.WarnFormat(
"[GESTURES]: Unable to find gesture to activate {0} for {1}", gestureId, client.Name); "[GESTURES]: Unable to find gesture {0} to activate for {1}", gestureId, client.Name);
}
else
m_log.ErrorFormat("[GESTURES]: Unable to find user {0}", client.Name);
} }
public virtual void DeactivateGesture(IClientAPI client, UUID gestureId) public virtual void DeactivateGesture(IClientAPI client, UUID gestureId)
{ {
CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(client.AgentId); IInventoryService invService = m_scene.InventoryService;
if (userInfo != null) InventoryItemBase item = invService.GetItem(new InventoryItemBase(gestureId));
{
InventoryItemBase item = userInfo.RootFolder.FindItem(gestureId);
if (item != null) if (item != null)
{ {
item.Flags = 0; item.Flags = 0;
userInfo.UpdateItem(item); invService.UpdateItem(item);
} }
else else
m_log.ErrorFormat( m_log.ErrorFormat(
"[GESTURES]: Unable to find gesture to deactivate {0} for {1}", gestureId, client.Name); "[GESTURES]: Unable to find gesture to deactivate {0} for {1}", gestureId, client.Name);
} }
else
m_log.ErrorFormat("[GESTURES]: Unable to find user {0}", client.Name);
}
} }
} }

View File

@ -35,6 +35,7 @@ using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Communications.Cache;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Interfaces;
namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
{ {
@ -154,7 +155,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
"into agent {1}'s inventory", "into agent {1}'s inventory",
folderID, new UUID(im.toAgentID)); folderID, new UUID(im.toAgentID));
InventoryFolderImpl folderCopy InventoryFolderBase folderCopy
= scene.GiveInventoryFolder(new UUID(im.toAgentID), client.AgentId, folderID, UUID.Zero); = scene.GiveInventoryFolder(new UUID(im.toAgentID), client.AgentId, folderID, UUID.Zero);
if (folderCopy == null) if (folderCopy == null)
@ -247,35 +248,35 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
// It will have been pushed to the client, too // It will have been pushed to the client, too
// //
CachedUserInfo userInfo = //CachedUserInfo userInfo =
scene.CommsManager.UserProfileCacheService. // scene.CommsManager.UserProfileCacheService.
GetUserDetails(client.AgentId); // GetUserDetails(client.AgentId);
IInventoryService invService = scene.InventoryService;
if (userInfo != null) InventoryFolderBase trashFolder =
{ invService.GetFolderForType(client.AgentId, AssetType.TrashFolder);
InventoryFolderImpl trashFolder =
userInfo.FindFolderForType((int)AssetType.TrashFolder);
UUID inventoryEntityID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip UUID inventoryEntityID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip
InventoryItemBase item = userInfo.RootFolder.FindItem(inventoryEntityID); InventoryItemBase item = invService.GetItem(new InventoryItemBase(inventoryEntityID));
InventoryFolderBase folder = null; InventoryFolderBase folder = null;
if (item != null && trashFolder != null) if (item != null && trashFolder != null)
{ {
item.Folder = trashFolder.ID; item.Folder = trashFolder.ID;
userInfo.DeleteItem(inventoryEntityID); // Diva comment: can't we just update this item???
invService.DeleteItem(item);
scene.AddInventoryItem(client, item); scene.AddInventoryItem(client, item);
} }
else else
{ {
folder = userInfo.RootFolder.FindFolder(inventoryEntityID); folder = invService.GetFolder(new InventoryFolderBase(inventoryEntityID));
if (folder != null & trashFolder != null) if (folder != null & trashFolder != null)
{ {
userInfo.MoveFolder(inventoryEntityID, trashFolder.ID); folder.ParentID = trashFolder.ID;
invService.MoveFolder(folder);
} }
} }
@ -293,7 +294,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
client.SendAgentAlertMessage("Unable to delete "+ client.SendAgentAlertMessage("Unable to delete "+
"received inventory" + reason, false); "received inventory" + reason, false);
} }
}
ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID)); ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID));
@ -405,17 +405,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
return; return;
} }
CachedUserInfo userInfo = //CachedUserInfo userInfo =
scene.CommsManager.UserProfileCacheService. // scene.CommsManager.UserProfileCacheService.
GetUserDetails(user.ControllingClient.AgentId); // GetUserDetails(user.ControllingClient.AgentId);
if (userInfo == null) //if (userInfo == null)
{ //{
m_log.Debug("[INVENTORY TRANSFER] Can't find user info of recipient"); // m_log.Debug("[INVENTORY TRANSFER] Can't find user info of recipient");
return; // return;
} //}
AssetType assetType = (AssetType)msg.binaryBucket[0]; AssetType assetType = (AssetType)msg.binaryBucket[0];
IInventoryService invService = scene.InventoryService;
if (AssetType.Folder == assetType) if (AssetType.Folder == assetType)
{ {
@ -425,31 +426,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
folder.ID = folderID; folder.ID = folderID;
folder.Owner = user.ControllingClient.AgentId; folder.Owner = user.ControllingClient.AgentId;
// Fetch from database // Fetch from service
// //
if (!userInfo.QueryFolder(folder)) folder = invService.GetFolder(folder);
if (folder == null)
{ {
m_log.Debug("[INVENTORY TRANSFER] Can't find folder to give"); m_log.Debug("[INVENTORY TRANSFER] Can't find folder to give");
return; return;
} }
// Get folder info user.ControllingClient.SendBulkUpdateInventory(folder);
//
InventoryFolderImpl folderInfo = userInfo.RootFolder.FindFolder(folder.ID);
if (folderInfo == null)
{
m_log.Debug("[INVENTORY TRANSFER] Can't retrieve folder to give");
return;
}
user.ControllingClient.SendBulkUpdateInventory(folderInfo); //// This unelegant, slow kludge is to reload the folders and
//// items. Since a folder give can transfer subfolders and
// This unelegant, slow kludge is to reload the folders and //// items, this is the easiest way to pull that stuff in
// items. Since a folder give can transfer subfolders and ////
// items, this is the easiest way to pull that stuff in //userInfo.DropInventory();
// //userInfo.FetchInventory();
userInfo.DropInventory();
userInfo.FetchInventory();
// Deliver message // Deliver message
// //
@ -463,20 +456,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
item.ID = itemID; item.ID = itemID;
item.Owner = user.ControllingClient.AgentId; item.Owner = user.ControllingClient.AgentId;
// Fetch from database // Fetch from service
// //
if (!userInfo.QueryItem(item)) item = invService.GetItem(item);
{
m_log.Debug("[INVENTORY TRANSFER] Can't find item to give");
return;
}
// Get item info
//
item = userInfo.RootFolder.FindItem(item.ID);
if (item == null) if (item == null)
{ {
m_log.Debug("[INVENTORY TRANSFER] Can't retrieve item to give"); m_log.Debug("[INVENTORY TRANSFER] Can't find item to give");
return; return;
} }

View File

@ -82,7 +82,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
/// </summary> /// </summary>
/// <param name="userID"></param> /// <param name="userID"></param>
/// <returns>null if no root folder was found</returns> /// <returns>null if no root folder was found</returns>
public abstract InventoryFolderBase GetRootFolder(UUID userID); public InventoryFolderBase GetRootFolder(UUID userID)
{
// Root folder is here as system type Folder.
return m_cache.GetFolderForType(userID, AssetType.Folder);
}
public abstract Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID); public abstract Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID);
@ -184,9 +188,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
/// <returns>true if the item was successfully deleted</returns> /// <returns>true if the item was successfully deleted</returns>
public abstract bool DeleteItem(InventoryItemBase item); public abstract bool DeleteItem(InventoryItemBase item);
public abstract InventoryItemBase QueryItem(InventoryItemBase item); public abstract InventoryItemBase GetItem(InventoryItemBase item);
public abstract InventoryFolderBase QueryFolder(InventoryFolderBase folder); public abstract InventoryFolderBase GetFolder(InventoryFolderBase folder);
/// <summary> /// <summary>
/// Does the given user have an inventory structure? /// Does the given user have an inventory structure?
@ -202,5 +206,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
/// <returns></returns> /// <returns></returns>
public abstract List<InventoryItemBase> GetActiveGestures(UUID userId); public abstract List<InventoryItemBase> GetActiveGestures(UUID userId);
public abstract int GetAssetPermissions(UUID userID, UUID assetID);
} }
} }

View File

@ -238,7 +238,19 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
public override Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID) public override Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID)
{ {
if (IsLocalGridUser(userID)) if (IsLocalGridUser(userID))
{
// This is not pretty, but it will have to do for now
if (m_GridService is BaseInventoryConnector)
{
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetSystemsFolders redirected to RemoteInventoryServiceConnector module");
return ((BaseInventoryConnector)m_GridService).GetSystemFolders(userID);
}
else
{
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetSystemsFolders redirected to GetSystemFoldersLocal");
return GetSystemFoldersLocal(userID); return GetSystemFoldersLocal(userID);
}
}
else else
{ {
UUID sessionID = GetSessionID(userID); UUID sessionID = GetSessionID(userID);
@ -263,6 +275,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
folders[(AssetType)folder.Type] = folder; folders[(AssetType)folder.Type] = folder;
} }
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: System folders count for {0}: {1}", userID, folders.Count); m_log.DebugFormat("[HG INVENTORY CONNECTOR]: System folders count for {0}: {1}", userID, folders.Count);
// Put the root folder there, as type Folder
folders[AssetType.Folder] = root;
return folders; return folders;
} }
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder content not found for {0}", userID); m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder content not found for {0}", userID);
@ -387,13 +401,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
} }
} }
public override InventoryItemBase QueryItem(InventoryItemBase item) public override InventoryItemBase GetItem(InventoryItemBase item)
{ {
if (item == null) if (item == null)
return null; return null;
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetItem {0} for user {1}", item.ID, item.Owner);
if (IsLocalGridUser(item.Owner)) if (IsLocalGridUser(item.Owner))
return m_GridService.QueryItem(item); return m_GridService.GetItem(item);
else else
{ {
UUID sessionID = GetSessionID(item.Owner); UUID sessionID = GetSessionID(item.Owner);
@ -402,13 +416,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
} }
} }
public override InventoryFolderBase QueryFolder(InventoryFolderBase folder) public override InventoryFolderBase GetFolder(InventoryFolderBase folder)
{ {
if (folder == null) if (folder == null)
return null; return null;
if (IsLocalGridUser(folder.Owner)) if (IsLocalGridUser(folder.Owner))
return m_GridService.QueryFolder(folder); return m_GridService.GetFolder(folder);
else else
{ {
UUID sessionID = GetSessionID(folder.Owner); UUID sessionID = GetSessionID(folder.Owner);
@ -422,39 +436,56 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
return false; return false;
} }
public override InventoryFolderBase GetRootFolder(UUID userID)
{
return null;
}
public override List<InventoryItemBase> GetActiveGestures(UUID userId) public override List<InventoryItemBase> GetActiveGestures(UUID userId)
{ {
return new List<InventoryItemBase>(); return new List<InventoryItemBase>();
} }
public override int GetAssetPermissions(UUID userID, UUID assetID)
{
if (IsLocalGridUser(userID))
return m_GridService.GetAssetPermissions(userID, assetID);
else
{
UUID sessionID = GetSessionID(userID);
string uri = GetUserInventoryURI(userID) + "/" + userID.ToString();
return m_HGService.GetAssetPermissions(uri, assetID, sessionID);
}
}
#endregion #endregion
private UUID GetSessionID(UUID userID) private UUID GetSessionID(UUID userID)
{ {
ScenePresence sp = m_Scene.GetScenePresence(userID); CachedUserInfo uinfo = m_UserProfileService.GetUserDetails(userID);
if (sp != null) if (uinfo != null)
return sp.ControllingClient.SessionId; return uinfo.SessionID;
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: user profile for {0} not found", userID);
return UUID.Zero; return UUID.Zero;
} }
private bool IsLocalGridUser(UUID userID) private bool IsLocalGridUser(UUID userID)
{ {
if (m_UserProfileService == null) if (m_UserProfileService == null)
{
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: IsLocalGridUser, no profile service. Returning false.");
return false; return false;
}
CachedUserInfo uinfo = m_UserProfileService.GetUserDetails(userID); CachedUserInfo uinfo = m_UserProfileService.GetUserDetails(userID);
if (uinfo == null) if (uinfo == null)
{
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: IsLocalGridUser, no profile for user {0}. Returning true.", userID);
return true; return true;
}
string userInventoryServerURI = HGNetworkServersInfo.ServerURI(uinfo.UserProfile.UserInventoryURI); string userInventoryServerURI = HGNetworkServersInfo.ServerURI(uinfo.UserProfile.UserInventoryURI);
string uri = m_LocalGridInventoryURI.TrimEnd('/');
if ((userInventoryServerURI == m_LocalGridInventoryURI) || (userInventoryServerURI == "")) m_log.DebugFormat("[HG INVENTORY CONNECTOR]: IsLocalGridUser, comparing {0} to {1}.", userInventoryServerURI, uri);
if ((userInventoryServerURI == uri) || (userInventoryServerURI == ""))
{ {
return true; return true;
} }

View File

@ -91,6 +91,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
Dictionary<AssetType, InventoryFolderBase> folders = m_Connector.GetSystemFolders(presence.UUID); Dictionary<AssetType, InventoryFolderBase> folders = m_Connector.GetSystemFolders(presence.UUID);
m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent in {0}, fetched system folders for {1} {2}: count {3}", m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent in {0}, fetched system folders for {1} {2}: count {3}",
presence.Scene.RegionInfo.RegionName, presence.Firstname, presence.Lastname, folders.Count); presence.Scene.RegionInfo.RegionName, presence.Firstname, presence.Lastname, folders.Count);
if (folders.Count > 0) if (folders.Count > 0)
lock (m_InventoryCache) lock (m_InventoryCache)
m_InventoryCache.Add(presence.UUID, folders); m_InventoryCache.Add(presence.UUID, folders);

View File

@ -201,8 +201,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
foreach (InventoryFolderBase folder in content.Folders) foreach (InventoryFolderBase folder in content.Folders)
{ {
if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown)) if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown))
{
m_log.InfoFormat("[INVENTORY CONNECTOR]: folder type {0} ", folder.Type);
folders[(AssetType)folder.Type] = folder; folders[(AssetType)folder.Type] = folder;
} }
}
// Put the root folder there, as type Folder
folders[AssetType.Folder] = root;
m_log.InfoFormat("[INVENTORY CONNECTOR]: root folder is type {0} ", root.Type);
return folders; return folders;
} }
} }
@ -292,14 +299,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
return m_InventoryService.DeleteItem(item); return m_InventoryService.DeleteItem(item);
} }
public override InventoryItemBase QueryItem(InventoryItemBase item) public override InventoryItemBase GetItem(InventoryItemBase item)
{ {
return m_InventoryService.QueryItem(item); return m_InventoryService.GetItem(item);
} }
public override InventoryFolderBase QueryFolder(InventoryFolderBase folder) public override InventoryFolderBase GetFolder(InventoryFolderBase folder)
{ {
return m_InventoryService.QueryFolder(folder); return m_InventoryService.GetFolder(folder);
} }
/// <summary> /// <summary>
@ -312,20 +319,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
return m_InventoryService.HasInventoryForUser(userID); return m_InventoryService.HasInventoryForUser(userID);
} }
/// <summary>
/// Retrieve the root inventory folder for the given user.
/// </summary>
/// <param name="userID"></param>
/// <returns>null if no root folder was found</returns>
public override InventoryFolderBase GetRootFolder(UUID userID)
{
return m_InventoryService.GetRootFolder(userID);
}
public override List<InventoryItemBase> GetActiveGestures(UUID userId) public override List<InventoryItemBase> GetActiveGestures(UUID userId)
{ {
return m_InventoryService.GetActiveGestures(userId); return m_InventoryService.GetActiveGestures(userId);
} }
public override int GetAssetPermissions(UUID userID, UUID assetID)
{
return m_InventoryService.GetAssetPermissions(userID, assetID);
}
#endregion IInventoryService #endregion IInventoryService
} }
} }

View File

@ -32,6 +32,7 @@ using System.Reflection;
using Nini.Config; using Nini.Config;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Framework.Statistics; using OpenSim.Framework.Statistics;
using OpenSim.Framework.Communications.Cache;
using OpenSim.Services.Connectors; using OpenSim.Services.Connectors;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
@ -48,6 +49,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
private bool m_Enabled = false; private bool m_Enabled = false;
private bool m_Initialized = false; private bool m_Initialized = false;
private Scene m_Scene; private Scene m_Scene;
private UserProfileCacheService m_UserProfileService;
private InventoryServicesConnector m_RemoteConnector; private InventoryServicesConnector m_RemoteConnector;
public Type ReplaceableInterface public Type ReplaceableInterface
@ -104,12 +106,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
public void AddRegion(Scene scene) public void AddRegion(Scene scene)
{ {
m_Scene = scene;
m_log.Debug("[XXXX] Adding scene " + m_Scene.RegionInfo.RegionName);
if (!m_Enabled) if (!m_Enabled)
return; return;
if (!m_Initialized) if (!m_Initialized)
{ {
m_Scene = scene;
// ugh! // ugh!
scene.CommsManager.UserProfileCacheService.SetInventoryService(this); scene.CommsManager.UserProfileCacheService.SetInventoryService(this);
scene.CommsManager.UserService.SetInventoryService(this); scene.CommsManager.UserService.SetInventoryService(this);
@ -130,6 +134,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
public void RegionLoaded(Scene scene) public void RegionLoaded(Scene scene)
{ {
m_UserProfileService = m_Scene.CommsManager.UserProfileCacheService;
if (m_UserProfileService != null)
m_log.Debug("[XXXX] Set m_UserProfileService in " + m_Scene.RegionInfo.RegionName);
if (!m_Enabled) if (!m_Enabled)
return; return;
@ -273,7 +281,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
return m_RemoteConnector.DeleteItem(item.Owner.ToString(), item, sessionID); return m_RemoteConnector.DeleteItem(item.Owner.ToString(), item, sessionID);
} }
public override InventoryItemBase QueryItem(InventoryItemBase item) public override InventoryItemBase GetItem(InventoryItemBase item)
{ {
if (item == null) if (item == null)
return null; return null;
@ -282,7 +290,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
return m_RemoteConnector.QueryItem(item.Owner.ToString(), item, sessionID); return m_RemoteConnector.QueryItem(item.Owner.ToString(), item, sessionID);
} }
public override InventoryFolderBase QueryFolder(InventoryFolderBase folder) public override InventoryFolderBase GetFolder(InventoryFolderBase folder)
{ {
if (folder == null) if (folder == null)
return null; return null;
@ -296,26 +304,40 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
return false; return false;
} }
public override InventoryFolderBase GetRootFolder(UUID userID)
{
return null;
}
public override List<InventoryItemBase> GetActiveGestures(UUID userId) public override List<InventoryItemBase> GetActiveGestures(UUID userId)
{ {
return new List<InventoryItemBase>(); return new List<InventoryItemBase>();
} }
public override int GetAssetPermissions(UUID userID, UUID assetID)
{
UUID sessionID = GetSessionID(userID);
return m_RemoteConnector.GetAssetPermissions(userID.ToString(), assetID, sessionID);
}
#endregion #endregion
private UUID GetSessionID(UUID userID) private UUID GetSessionID(UUID userID)
{ {
ScenePresence sp = m_Scene.GetScenePresence(userID); if (m_Scene == null)
if (sp != null) {
return sp.ControllingClient.SessionId; m_log.Debug("[INVENTORY CONNECTOR]: OOPS! scene is null");
}
if (m_UserProfileService == null)
{
m_log.Debug("[INVENTORY CONNECTOR]: OOPS! UserProfileCacheService is null");
return UUID.Zero; return UUID.Zero;
} }
CachedUserInfo uinfo = m_UserProfileService.GetUserDetails(userID);
if (uinfo != null)
return uinfo.SessionID;
m_log.DebugFormat("[INVENTORY CONNECTOR]: user profile for {0} not found", userID);
return UUID.Zero;
}
} }
} }

View File

@ -35,6 +35,7 @@ using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Communications.Cache;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Interfaces;
// Temporary fix of wrong GroupPowers constants in OpenMetaverse library // Temporary fix of wrong GroupPowers constants in OpenMetaverse library
enum GroupPowers : long enum GroupPowers : long
@ -964,19 +965,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
if (objectID == UUID.Zero) // User inventory if (objectID == UUID.Zero) // User inventory
{ {
CachedUserInfo userInfo = IInventoryService invService = m_scene.InventoryService;
scene.CommsManager.UserProfileCacheService.GetUserDetails(user); InventoryItemBase assetRequestItem = invService.GetItem(new InventoryItemBase(notecard));
if (userInfo == null)
{
m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for edit notecard check", user);
return false;
}
if (userInfo.RootFolder == null)
return false;
InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(notecard);
if (assetRequestItem == null) // Library item if (assetRequestItem == null) // Library item
{ {
assetRequestItem = scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard); assetRequestItem = scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard);
@ -1394,19 +1384,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
if (objectID == UUID.Zero) // User inventory if (objectID == UUID.Zero) // User inventory
{ {
CachedUserInfo userInfo = IInventoryService invService = m_scene.InventoryService;
scene.CommsManager.UserProfileCacheService.GetUserDetails(user); InventoryItemBase assetRequestItem = invService.GetItem(new InventoryItemBase(script));
if (userInfo == null)
{
m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for administrator check", user);
return false;
}
if (userInfo.RootFolder == null)
return false;
InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(script);
if (assetRequestItem == null) // Library item if (assetRequestItem == null) // Library item
{ {
assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(script); assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(script);
@ -1499,19 +1478,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
if (objectID == UUID.Zero) // User inventory if (objectID == UUID.Zero) // User inventory
{ {
CachedUserInfo userInfo = IInventoryService invService = m_scene.InventoryService;
scene.CommsManager.UserProfileCacheService.GetUserDetails(user); InventoryItemBase assetRequestItem = invService.GetItem(new InventoryItemBase(notecard));
if (userInfo == null)
{
m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for view notecard check", user);
return false;
}
if (userInfo.RootFolder == null)
return false;
InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(notecard);
if (assetRequestItem == null) // Library item if (assetRequestItem == null) // Library item
{ {
assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard); assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard);

View File

@ -201,31 +201,31 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
} }
} }
public InventoryItemBase Get(InventoryItemBase item, UUID rootFolder, CachedUserInfo userInfo) //public InventoryItemBase Get(InventoryItemBase item, UUID rootFolder, CachedUserInfo userInfo)
{ //{
InventoryClient invCli = null; // InventoryClient invCli = null;
string inventoryURL = UserInventoryURL(item.Owner); // string inventoryURL = UserInventoryURL(item.Owner);
if (!m_inventoryServers.TryGetValue(inventoryURL, out invCli)) // if (!m_inventoryServers.TryGetValue(inventoryURL, out invCli))
{ // {
m_log.Debug("[HGScene]: Starting new InventorytClient for " + inventoryURL); // m_log.Debug("[HGScene]: Starting new InventorytClient for " + inventoryURL);
invCli = new InventoryClient(inventoryURL); // invCli = new InventoryClient(inventoryURL);
m_inventoryServers.Add(inventoryURL, invCli); // m_inventoryServers.Add(inventoryURL, invCli);
} // }
item = invCli.GetInventoryItem(item); // item = invCli.GetInventoryItem(item);
if (item != null) // if (item != null)
{ // {
// Change the folder, stick it in root folder, all items flattened out here in this region cache // // Change the folder, stick it in root folder, all items flattened out here in this region cache
item.Folder = rootFolder; // item.Folder = rootFolder;
//userInfo.AddItem(item); don't use this, it calls back to the inventory server // //userInfo.AddItem(item); don't use this, it calls back to the inventory server
lock (userInfo.RootFolder.Items) // lock (userInfo.RootFolder.Items)
{ // {
userInfo.RootFolder.Items[item.ID] = item; // userInfo.RootFolder.Items[item.ID] = item;
} // }
} // }
return item; // return item;
} //}
public void Post(UUID assetID, UUID ownerID) public void Post(UUID assetID, UUID ownerID)
{ {

View File

@ -117,27 +117,22 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
if (fromTaskID.Equals(UUID.Zero)) if (fromTaskID.Equals(UUID.Zero))
{ {
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); InventoryItemBase item = new InventoryItemBase(itemID);
if (userInfo != null)
{
if (userInfo.RootFolder != null)
{
InventoryItemBase item = userInfo.RootFolder.FindItem(itemID);
if (item == null)
{ // Fetch the item
item = new InventoryItemBase();
item.Owner = remoteClient.AgentId; item.Owner = remoteClient.AgentId;
item.ID = itemID; item = InventoryService.GetItem(item);
item = m_assMapper.Get(item, userInfo.RootFolder.ID, userInfo); //if (item == null)
} //{ // Fetch the item
// item = new InventoryItemBase();
// item.Owner = remoteClient.AgentId;
// item.ID = itemID;
// item = m_assMapper.Get(item, userInfo.RootFolder.ID, userInfo);
//}
if (item != null) if (item != null)
{ {
m_assMapper.Get(item.AssetID, remoteClient.AgentId); m_assMapper.Get(item.AssetID, remoteClient.AgentId);
} }
} }
}
}
// OK, we're done fetching. Pass it up to the default RezObject // OK, we're done fetching. Pass it up to the default RezObject
return base.RezObject(remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection, return base.RezObject(remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection,

View File

@ -80,17 +80,12 @@ namespace OpenSim.Region.Framework.Scenes
public bool AddInventoryItemReturned(UUID AgentId, InventoryItemBase item) public bool AddInventoryItemReturned(UUID AgentId, InventoryItemBase item)
{ {
CachedUserInfo userInfo if (InventoryService.AddItem(item))
= CommsManager.UserProfileCacheService.GetUserDetails(AgentId);
if (userInfo != null)
{
userInfo.AddItem(item);
return true; return true;
}
else else
{ {
m_log.ErrorFormat( m_log.WarnFormat(
"[AGENT INVENTORY]: Agent was not found for add of item {1} {2}", item.Name, item.ID); "[AGENT INVENTORY]: Unable to add item {1} to agent {2} inventory", item.Name, AgentId);
return false; return false;
} }
@ -98,13 +93,9 @@ namespace OpenSim.Region.Framework.Scenes
public void AddInventoryItem(UUID AgentID, InventoryItemBase item) public void AddInventoryItem(UUID AgentID, InventoryItemBase item)
{ {
CachedUserInfo userInfo
= CommsManager.UserProfileCacheService.GetUserDetails(AgentID);
if (userInfo != null) if (InventoryService.AddItem(item))
{ {
userInfo.AddItem(item);
int userlevel = 0; int userlevel = 0;
if (Permissions.IsGod(AgentID)) if (Permissions.IsGod(AgentID))
{ {
@ -120,8 +111,8 @@ namespace OpenSim.Region.Framework.Scenes
} }
else else
{ {
m_log.ErrorFormat( m_log.WarnFormat(
"[AGENT INVENTORY]: Agent {1} was not found for add of item {2} {3}", "[AGENT INVENTORY]: Agent {1} could not add item {2} {3}",
AgentID, item.Name, item.ID); AgentID, item.Name, item.ID);
return; return;
@ -135,22 +126,10 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="item">The item. This structure contains all the item metadata, including the folder /// <param name="item">The item. This structure contains all the item metadata, including the folder
/// in which the item is to be placed.</param> /// in which the item is to be placed.</param>
public void AddInventoryItem(IClientAPI remoteClient, InventoryItemBase item) public void AddInventoryItem(IClientAPI remoteClient, InventoryItemBase item)
{
CachedUserInfo userInfo
= CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (userInfo != null)
{ {
AddInventoryItem(remoteClient.AgentId, item); AddInventoryItem(remoteClient.AgentId, item);
remoteClient.SendInventoryItemCreateUpdate(item, 0); remoteClient.SendInventoryItemCreateUpdate(item, 0);
} }
else
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Could not resolve user {0} for adding an inventory item",
remoteClient.AgentId);
}
}
/// <summary> /// <summary>
/// Capability originating call to update the asset of an item in an agent's inventory /// Capability originating call to update the asset of an item in an agent's inventory
@ -161,12 +140,7 @@ namespace OpenSim.Region.Framework.Scenes
/// <returns></returns> /// <returns></returns>
public virtual UUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, UUID itemID, byte[] data) public virtual UUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, UUID itemID, byte[] data)
{ {
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID));
if (userInfo != null)
{
if (userInfo.RootFolder != null)
{
InventoryItemBase item = userInfo.RootFolder.FindItem(itemID);
if (item != null) if (item != null)
{ {
@ -196,13 +170,11 @@ namespace OpenSim.Region.Framework.Scenes
item.AssetID = asset.FullID; item.AssetID = asset.FullID;
AssetService.Store(asset); AssetService.Store(asset);
userInfo.UpdateItem(item); InventoryService.UpdateItem(item);
// remoteClient.SendInventoryItemCreateUpdate(item); // remoteClient.SendInventoryItemCreateUpdate(item);
return (asset.FullID); return (asset.FullID);
} }
}
}
else else
{ {
m_log.ErrorFormat( m_log.ErrorFormat(
@ -343,12 +315,7 @@ namespace OpenSim.Region.Framework.Scenes
public void UpdateInventoryItemAsset(IClientAPI remoteClient, UUID transactionID, public void UpdateInventoryItemAsset(IClientAPI remoteClient, UUID transactionID,
UUID itemID, InventoryItemBase itemUpd) UUID itemID, InventoryItemBase itemUpd)
{ {
CachedUserInfo userInfo InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID));
= CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (userInfo != null && userInfo.RootFolder != null)
{
InventoryItemBase item = userInfo.RootFolder.FindItem(itemID);
if (item != null) if (item != null)
{ {
@ -378,7 +345,7 @@ namespace OpenSim.Region.Framework.Scenes
item.SaleType = itemUpd.SaleType; item.SaleType = itemUpd.SaleType;
item.Flags = itemUpd.Flags; item.Flags = itemUpd.Flags;
userInfo.UpdateItem(item); InventoryService.UpdateItem(item);
} }
else else
{ {
@ -396,12 +363,6 @@ namespace OpenSim.Region.Framework.Scenes
"[AGENTINVENTORY]: Item ID " + itemID + " not found for an inventory item update."); "[AGENTINVENTORY]: Item ID " + itemID + " not found for an inventory item update.");
} }
} }
else
{
m_log.Error(
"[AGENT INVENTORY]: Agent ID " + remoteClient.AgentId + " not found for an inventory item update.");
}
}
/// <summary> /// <summary>
/// Give an inventory item from one user to another /// Give an inventory item from one user to another
@ -445,24 +406,11 @@ namespace OpenSim.Region.Framework.Scenes
public virtual InventoryItemBase GiveInventoryItem( public virtual InventoryItemBase GiveInventoryItem(
UUID recipient, UUID senderId, UUID itemId, UUID recipientFolderId) UUID recipient, UUID senderId, UUID itemId, UUID recipientFolderId)
{ {
// Retrieve the item from the sender
CachedUserInfo senderUserInfo = CommsManager.UserProfileCacheService.GetUserDetails(senderId);
Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem"); Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem");
if (senderUserInfo == null) InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemId));
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Failed to find sending user {0} for item {1}", senderId, itemId);
return null; if ((item != null) && (item.Owner == senderId))
}
if (senderUserInfo.RootFolder != null)
{
InventoryItemBase item = senderUserInfo.RootFolder.FindItem(itemId);
if (item != null)
{ {
if (!Permissions.BypassPermissions()) if (!Permissions.BypassPermissions())
{ {
@ -470,14 +418,6 @@ namespace OpenSim.Region.Framework.Scenes
return null; return null;
} }
CachedUserInfo recipientUserInfo
= CommsManager.UserProfileCacheService.GetUserDetails(recipient);
if (recipientUserInfo != null)
{
if (!recipientUserInfo.HasReceivedInventory)
recipientUserInfo.FetchInventory();
// Insert a copy of the item into the recipient // Insert a copy of the item into the recipient
InventoryItemBase itemCopy = new InventoryItemBase(); InventoryItemBase itemCopy = new InventoryItemBase();
itemCopy.Owner = recipient; itemCopy.Owner = recipient;
@ -529,39 +469,22 @@ namespace OpenSim.Region.Framework.Scenes
itemCopy.SalePrice = item.SalePrice; itemCopy.SalePrice = item.SalePrice;
itemCopy.SaleType = item.SaleType; itemCopy.SaleType = item.SaleType;
recipientUserInfo.AddItem(itemCopy); InventoryService.AddItem(itemCopy);
if (!Permissions.BypassPermissions()) if (!Permissions.BypassPermissions())
{ {
if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
senderUserInfo.DeleteItem(itemId); InventoryService.DeleteItem(new InventoryItemBase(itemId));
} }
return itemCopy; return itemCopy;
} }
else else
{ {
m_log.ErrorFormat( m_log.WarnFormat("[AGENT INVENTORY]: Failed to find item {0} or item does not belong to giver ", itemId);
"[AGENT INVENTORY]: Could not find userinfo for recipient user {0} of item {1}, {2} from {3}",
recipient, item.Name,
item.ID, senderId);
}
}
else
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Failed to find item {0} to give to {1}", itemId, senderId);
return null;
}
}
else
{
m_log.Error("[AGENT INVENTORY]: Failed to find item " + itemId.ToString() + ", no root folder");
return null; return null;
} }
return null;
} }
/// <summary> /// <summary>
@ -578,31 +501,11 @@ namespace OpenSim.Region.Framework.Scenes
/// <returns> /// <returns>
/// The inventory folder copy given, null if the copy was unsuccessful /// The inventory folder copy given, null if the copy was unsuccessful
/// </returns> /// </returns>
public virtual InventoryFolderImpl GiveInventoryFolder( public virtual InventoryFolderBase GiveInventoryFolder(
UUID recipientId, UUID senderId, UUID folderId, UUID recipientParentFolderId) UUID recipientId, UUID senderId, UUID folderId, UUID recipientParentFolderId)
{ {
// Retrieve the folder from the sender //// Retrieve the folder from the sender
CachedUserInfo senderUserInfo = CommsManager.UserProfileCacheService.GetUserDetails(senderId); InventoryFolderBase folder = InventoryService.GetFolder(new InventoryFolderBase(folderId));
if (null == senderUserInfo)
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Failed to find sending user {0} for folder {1}", senderId, folderId);
return null;
}
if (!senderUserInfo.HasReceivedInventory)
{
m_log.DebugFormat(
"[AGENT INVENTORY]: Could not give inventory folder - have not yet received inventory for {0}",
senderId);
return null;
}
InventoryFolderImpl folder = senderUserInfo.RootFolder.FindFolder(folderId);
if (null == folder) if (null == folder)
{ {
m_log.ErrorFormat( m_log.ErrorFormat(
@ -611,48 +514,37 @@ namespace OpenSim.Region.Framework.Scenes
return null; return null;
} }
CachedUserInfo recipientUserInfo
= CommsManager.UserProfileCacheService.GetUserDetails(recipientId);
if (null == recipientUserInfo)
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Failed to find receiving user {0} for folder {1}", recipientId, folderId);
return null;
}
if (!recipientUserInfo.HasReceivedInventory)
{
recipientUserInfo.FetchInventory();
if (!WaitForInventory(recipientUserInfo))
return null;
}
if (recipientParentFolderId == UUID.Zero) if (recipientParentFolderId == UUID.Zero)
recipientParentFolderId = recipientUserInfo.RootFolder.ID; {
InventoryFolderBase recipientRootFolder = InventoryService.GetRootFolder(recipientId);
if (recipientRootFolder != null)
recipientParentFolderId = recipientRootFolder.ID;
else
{
m_log.WarnFormat("[AGENT INVENTORY]: Unable to find root folder for receiving agent");
return null;
}
}
UUID newFolderId = UUID.Random(); UUID newFolderId = UUID.Random();
recipientUserInfo.CreateFolder(folder.Name, newFolderId, (ushort)folder.Type, recipientParentFolderId); InventoryFolderBase newFolder = new InventoryFolderBase(newFolderId, folder.Name, recipientId, folder.Type, recipientParentFolderId, folder.Version);
InventoryService.AddFolder(newFolder);
// XXX: Messy - we should really get this back in the CreateFolder call
InventoryFolderImpl copiedFolder = recipientUserInfo.RootFolder.FindFolder(newFolderId);
// Give all the subfolders // Give all the subfolders
List<InventoryFolderImpl> subFolders = folder.RequestListOfFolderImpls(); InventoryCollection contents = InventoryService.GetFolderContent(senderId, folderId);
foreach (InventoryFolderImpl childFolder in subFolders) foreach (InventoryFolderBase childFolder in contents.Folders)
{ {
GiveInventoryFolder(recipientId, senderId, childFolder.ID, copiedFolder.ID); GiveInventoryFolder(recipientId, senderId, childFolder.ID, newFolder.ID);
} }
// Give all the items // Give all the items
List<InventoryItemBase> items = folder.RequestListOfItems(); foreach (InventoryItemBase item in contents.Items)
foreach (InventoryItemBase item in items)
{ {
GiveInventoryItem(recipientId, senderId, item.ID, copiedFolder.ID); GiveInventoryItem(recipientId, senderId, item.ID, newFolder.ID);
} }
return copiedFolder; return newFolder;
} }
public void CopyInventoryItem(IClientAPI remoteClient, uint callbackID, UUID oldAgentID, UUID oldItemID, public void CopyInventoryItem(IClientAPI remoteClient, uint callbackID, UUID oldAgentID, UUID oldItemID,
@ -666,16 +558,7 @@ namespace OpenSim.Region.Framework.Scenes
if (item == null) if (item == null)
{ {
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(oldAgentID); item = InventoryService.GetItem(new InventoryItemBase(oldItemID));
if (userInfo == null)
{
m_log.Error("[AGENT INVENTORY]: Failed to find user " + oldAgentID.ToString());
return;
}
if (userInfo.RootFolder != null)
{
item = userInfo.RootFolder.FindItem(oldItemID);
if (item == null) if (item == null)
{ {
@ -683,12 +566,6 @@ namespace OpenSim.Region.Framework.Scenes
return; return;
} }
} }
else
{
m_log.Error("[AGENT INVENTORY]: Failed to find item " + oldItemID.ToString());
return;
}
}
AssetBase asset = AssetService.Get(item.AssetID.ToString()); AssetBase asset = AssetService.Get(item.AssetID.ToString());
@ -759,18 +636,7 @@ namespace OpenSim.Region.Framework.Scenes
m_log.DebugFormat( m_log.DebugFormat(
"[AGENT INVENTORY]: Moving item {0} to {1} for {2}", itemID, folderID, remoteClient.AgentId); "[AGENT INVENTORY]: Moving item {0} to {1} for {2}", itemID, folderID, remoteClient.AgentId);
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID));
if (userInfo == null)
{
m_log.Error("[AGENT INVENTORY]: Failed to find user " + remoteClient.AgentId.ToString());
return;
}
if (userInfo.RootFolder != null)
{
InventoryItemBase item = userInfo.RootFolder.FindItem(itemID);
if (item != null) if (item != null)
{ {
@ -780,20 +646,14 @@ namespace OpenSim.Region.Framework.Scenes
} }
item.Folder = folderID; item.Folder = folderID;
userInfo.DeleteItem(item.ID); // Diva comment: can't we just update?
InventoryService.DeleteItem(item);
AddInventoryItem(remoteClient, item); AddInventoryItem(remoteClient, item);
} }
else else
{ {
m_log.Error("[AGENT INVENTORY]: Failed to find item " + itemID.ToString()); m_log.Warn("[AGENT INVENTORY]: Failed to find item " + itemID.ToString());
return;
}
}
else
{
m_log.Error("[AGENT INVENTORY]: Failed to find item " + itemID.ToString() + ", no root folder");
return; return;
} }
@ -829,11 +689,6 @@ namespace OpenSim.Region.Framework.Scenes
private void CreateNewInventoryItem( private void CreateNewInventoryItem(
IClientAPI remoteClient, string creatorID, UUID folderID, string name, uint flags, uint callbackID, AssetBase asset, sbyte invType, IClientAPI remoteClient, string creatorID, UUID folderID, string name, uint flags, uint callbackID, AssetBase asset, sbyte invType,
uint baseMask, uint currentMask, uint everyoneMask, uint nextOwnerMask, uint groupMask, int creationDate) uint baseMask, uint currentMask, uint everyoneMask, uint nextOwnerMask, uint groupMask, int creationDate)
{
CachedUserInfo userInfo
= CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (userInfo != null)
{ {
InventoryItemBase item = new InventoryItemBase(); InventoryItemBase item = new InventoryItemBase();
item.Owner = remoteClient.AgentId; item.Owner = remoteClient.AgentId;
@ -853,14 +708,14 @@ namespace OpenSim.Region.Framework.Scenes
item.BasePermissions = baseMask; item.BasePermissions = baseMask;
item.CreationDate = creationDate; item.CreationDate = creationDate;
userInfo.AddItem(item); if (InventoryService.AddItem(item))
remoteClient.SendInventoryItemCreateUpdate(item, callbackID); remoteClient.SendInventoryItemCreateUpdate(item, callbackID);
}
else else
{ {
m_dialogModule.SendAlertToUser(remoteClient, "Failed to create item");
m_log.WarnFormat( m_log.WarnFormat(
"No user details associated with client {0} uuid {1} in CreateNewInventoryItem!", "Failed to add item for {0} in CreateNewInventoryItem!",
remoteClient.Name, remoteClient.AgentId); remoteClient.Name);
} }
} }
@ -941,19 +796,7 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="itemID"></param> /// <param name="itemID"></param>
private void RemoveInventoryItem(IClientAPI remoteClient, UUID itemID) private void RemoveInventoryItem(IClientAPI remoteClient, UUID itemID)
{ {
CachedUserInfo userInfo InventoryService.DeleteItem(new InventoryItemBase(itemID));
= CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (userInfo == null)
{
m_log.WarnFormat(
"[AGENT INVENTORY]: Failed to find user {0} {1} to delete inventory item {2}",
remoteClient.Name, remoteClient.AgentId, itemID);
return;
}
userInfo.DeleteItem(itemID);
} }
/// <summary> /// <summary>
@ -964,28 +807,15 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="folderID"></param> /// <param name="folderID"></param>
private void RemoveInventoryFolder(IClientAPI remoteClient, UUID folderID) private void RemoveInventoryFolder(IClientAPI remoteClient, UUID folderID)
{ {
CachedUserInfo userInfo // Unclear is this handler is ever called by the Linden client, but it might
= CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (userInfo == null) InventoryFolderBase folder = new InventoryFolderBase(folderID);
folder.Owner = remoteClient.AgentId;
InventoryFolderBase trash = InventoryService.GetFolderForType(remoteClient.AgentId, AssetType.TrashFolder);
if (trash != null)
{ {
m_log.Warn("[AGENT INVENTORY]: Failed to find user " + remoteClient.AgentId.ToString()); folder.ParentID = trash.ID;
return; InventoryService.MoveFolder(folder);
}
if (userInfo.RootFolder != null)
{
InventoryItemBase folder = userInfo.RootFolder.FindItem(folderID);
if (folder != null)
{
m_log.WarnFormat(
"[AGENT INVENTORY]: Remove folder not implemented in request by {0} {1} for {2}",
remoteClient.Name, remoteClient.AgentId, folderID);
// doesn't work just yet, commented out. will fix in next patch.
// userInfo.DeleteItem(folder);
}
} }
} }
@ -1203,19 +1033,6 @@ namespace OpenSim.Region.Framework.Scenes
} }
else else
{ {
CachedUserInfo profile = CommsManager.UserProfileCacheService.GetUserDetails(avatarId);
if (profile == null || profile.RootFolder == null)
{
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
"Avatar {0} cannot be found to add item",
avatarId);
return null;
}
if (!profile.HasReceivedInventory)
profile.FetchInventory();
InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(avatarId, part, itemId); InventoryItemBase agentItem = CreateAgentInventoryItemFromTask(avatarId, part, itemId);
if (agentItem == null) if (agentItem == null)
@ -1332,19 +1149,12 @@ namespace OpenSim.Region.Framework.Scenes
public UUID MoveTaskInventoryItems(UUID destID, string category, SceneObjectPart host, List<UUID> items) public UUID MoveTaskInventoryItems(UUID destID, string category, SceneObjectPart host, List<UUID> items)
{ {
CachedUserInfo profile = CommsManager.UserProfileCacheService.GetUserDetails(destID); InventoryFolderBase rootFolder = InventoryService.GetRootFolder(destID);
if (profile == null || profile.RootFolder == null)
{
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
"Avatar {0} cannot be found to add items",
destID);
return UUID.Zero;
}
UUID newFolderID = UUID.Random(); UUID newFolderID = UUID.Random();
profile.CreateFolder(category, newFolderID, 0xffff, profile.RootFolder.ID); InventoryFolderBase newFolder = new InventoryFolderBase(newFolderID, category, destID, 0xff, rootFolder.ID, rootFolder.Version);
InventoryService.AddFolder(newFolder);
foreach (UUID itemID in items) foreach (UUID itemID in items)
{ {
@ -1358,19 +1168,27 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
ScenePresence avatar; ScenePresence avatar = null;
if (TryGetAvatar(destID, out avatar)) if (TryGetAvatar(destID, out avatar))
{ {
profile.SendInventoryDecendents(avatar.ControllingClient, //profile.SendInventoryDecendents(avatar.ControllingClient,
profile.RootFolder.ID, true, false); // profile.RootFolder.ID, true, false);
profile.SendInventoryDecendents(avatar.ControllingClient, //profile.SendInventoryDecendents(avatar.ControllingClient,
newFolderID, false, true); // newFolderID, false, true);
SendInventoryUpdate(avatar.ControllingClient, rootFolder, true, false);
SendInventoryUpdate(avatar.ControllingClient, newFolder, false, true);
} }
return newFolderID; return newFolderID;
} }
private void SendInventoryUpdate(IClientAPI client, InventoryFolderBase folder, bool fetchFolders, bool fetchItems)
{
InventoryCollection contents = InventoryService.GetFolderContent(client.AgentId, folder.ID);
client.SendInventoryFolderDetails(client.AgentId, folder.ID, contents.Items, contents.Folders, fetchFolders, fetchItems);
}
/// <summary> /// <summary>
/// Update an item in a prim (task) inventory. /// Update an item in a prim (task) inventory.
/// This method does not handle scripts, <see>RezScript(IClientAPI, UUID, unit)</see> /// This method does not handle scripts, <see>RezScript(IClientAPI, UUID, unit)</see>
@ -1406,14 +1224,9 @@ namespace OpenSim.Region.Framework.Scenes
UUID copyID = UUID.Random(); UUID copyID = UUID.Random();
if (itemID != UUID.Zero) if (itemID != UUID.Zero)
{ {
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID));
if (userInfo != null && userInfo.RootFolder != null)
{
InventoryItemBase item = userInfo.RootFolder.FindItem(itemID);
// Try library // Try library
// XXX clumsy, possibly should be one call
if (null == item) if (null == item)
{ {
item = CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID); item = CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID);
@ -1440,7 +1253,6 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
} }
}
else // Updating existing item with new perms etc else // Updating existing item with new perms etc
{ {
IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>(); IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>();
@ -1475,11 +1287,7 @@ namespace OpenSim.Region.Framework.Scenes
if (itemID != UUID.Zero) // transferred from an avatar inventory to the prim's inventory if (itemID != UUID.Zero) // transferred from an avatar inventory to the prim's inventory
{ {
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID));
if (userInfo != null && userInfo.RootFolder != null)
{
InventoryItemBase item = userInfo.RootFolder.FindItem(itemID);
// Try library // Try library
// XXX clumsy, possibly should be one call // XXX clumsy, possibly should be one call
@ -1522,7 +1330,6 @@ namespace OpenSim.Region.Framework.Scenes
itemID, remoteClient.Name); itemID, remoteClient.Name);
} }
} }
}
else // script has been rezzed directly into a prim's inventory else // script has been rezzed directly into a prim's inventory
{ {
SceneObjectPart part = GetSceneObjectPart(itemBase.Folder); SceneObjectPart part = GetSceneObjectPart(itemBase.Folder);
@ -1811,26 +1618,6 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
private bool WaitForInventory(CachedUserInfo info)
{
// 200 Seconds wait. This is called in the context of the
// background delete thread, so we can afford to waste time
// here.
//
int count = 200;
while (count > 0)
{
System.Threading.Thread.Sleep(100);
count--;
if (info.HasReceivedInventory)
return true;
}
m_log.DebugFormat("Timed out waiting for inventory of user {0}",
info.UserProfile.ID.ToString());
return false;
}
/// <summary> /// <summary>
/// Delete a scene object from a scene and place in the given avatar's inventory. /// Delete a scene object from a scene and place in the given avatar's inventory.
/// Returns the UUID of the newly created asset. /// Returns the UUID of the newly created asset.
@ -1848,7 +1635,7 @@ namespace OpenSim.Region.Framework.Scenes
// Get the user info of the item destination // Get the user info of the item destination
// //
CachedUserInfo userInfo; UUID userID = UUID.Zero;
if (action == DeRezAction.Take || action == DeRezAction.TakeCopy || if (action == DeRezAction.Take || action == DeRezAction.TakeCopy ||
action == DeRezAction.SaveToExistingUserInventoryItem) action == DeRezAction.SaveToExistingUserInventoryItem)
@ -1859,30 +1646,21 @@ namespace OpenSim.Region.Framework.Scenes
if (remoteClient == null) if (remoteClient == null)
return UUID.Zero; return UUID.Zero;
userInfo = CommsManager.UserProfileCacheService.GetUserDetails( userID = remoteClient.AgentId;
remoteClient.AgentId);
} }
else else
{ {
// All returns / deletes go to the object owner // All returns / deletes go to the object owner
// //
userInfo = CommsManager.UserProfileCacheService.GetUserDetails(
objectGroup.RootPart.OwnerID); userID = objectGroup.RootPart.OwnerID;
} }
if (userInfo == null) // Can't proceed if (userID == UUID.Zero) // Can't proceed
{ {
return UUID.Zero; return UUID.Zero;
} }
if (!userInfo.HasReceivedInventory)
{
// Async inventory requests will queue, but they will never
// execute unless inventory is actually fetched
//
userInfo.FetchInventory();
}
// If we're returning someone's item, it goes back to the // If we're returning someone's item, it goes back to the
// owner's Lost And Found folder. // owner's Lost And Found folder.
// Delete is treated like return in this case // Delete is treated like return in this case
@ -1894,8 +1672,11 @@ namespace OpenSim.Region.Framework.Scenes
if (DeRezAction.SaveToExistingUserInventoryItem == action) if (DeRezAction.SaveToExistingUserInventoryItem == action)
{ {
item = userInfo.RootFolder.FindItem( item = new InventoryItemBase(objectGroup.RootPart.FromUserInventoryItemID);
objectGroup.RootPart.FromUserInventoryItemID); item = InventoryService.GetItem(item);
//item = userInfo.RootFolder.FindItem(
// objectGroup.RootPart.FromUserInventoryItemID);
if (null == item) if (null == item)
{ {
@ -1920,53 +1701,36 @@ namespace OpenSim.Region.Framework.Scenes
// have to wait for the inventory to find // have to wait for the inventory to find
// the destination folder // the destination folder
// //
if (!WaitForInventory(userInfo)) folder = InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
return UUID.Zero;
folder = userInfo.FindFolderForType(
(int)AssetType.LostAndFoundFolder);
} }
else else
{ {
// Assume inventory skeleton was loaded during login // Assume inventory skeleton was loaded during login
// and all folders can be found // and all folders can be found
// //
folder = userInfo.FindFolderForType( folder = InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
(int)AssetType.TrashFolder);
} }
} }
else if (action == DeRezAction.Return) else if (action == DeRezAction.Return)
{ {
// Wait if needed
//
if (!userInfo.HasReceivedInventory)
{
if (!WaitForInventory(userInfo))
return UUID.Zero;
}
// Dump to lost + found unconditionally // Dump to lost + found unconditionally
// //
folder = userInfo.FindFolderForType( folder = InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
(int)AssetType.LostAndFoundFolder);
} }
if (folderID == UUID.Zero && folder == null) if (folderID == UUID.Zero && folder == null)
{ {
// Catch all. Use lost & found // Catch all. Use lost & found
// //
if (!userInfo.HasReceivedInventory)
{
if (!WaitForInventory(userInfo))
return UUID.Zero;
}
folder = userInfo.FindFolderForType( folder = InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
(int)AssetType.LostAndFoundFolder);
} }
if (folder == null) // None of the above if (folder == null) // None of the above
{ {
folder = userInfo.RootFolder.FindFolder(folderID); //folder = userInfo.RootFolder.FindFolder(folderID);
folder = new InventoryFolderBase(folderID);
if (folder == null) // Nowhere to put it if (folder == null) // Nowhere to put it
{ {
@ -1979,7 +1743,7 @@ namespace OpenSim.Region.Framework.Scenes
item.ID = UUID.Random(); item.ID = UUID.Random();
item.InvType = (int)InventoryType.Object; item.InvType = (int)InventoryType.Object;
item.Folder = folder.ID; item.Folder = folder.ID;
item.Owner = userInfo.UserProfile.ID; item.Owner = userID;
} }
AssetBase asset = CreateAsset( AssetBase asset = CreateAsset(
@ -1993,7 +1757,7 @@ namespace OpenSim.Region.Framework.Scenes
if (DeRezAction.SaveToExistingUserInventoryItem == action) if (DeRezAction.SaveToExistingUserInventoryItem == action)
{ {
item.AssetID = asset.FullID; item.AssetID = asset.FullID;
userInfo.UpdateItem(item); InventoryService.UpdateItem(item);
} }
else else
{ {
@ -2034,7 +1798,7 @@ namespace OpenSim.Region.Framework.Scenes
item.Name = asset.Name; item.Name = asset.Name;
item.AssetType = asset.Type; item.AssetType = asset.Type;
userInfo.AddItem(item); InventoryService.AddItem(item);
if (remoteClient != null && item.Owner == remoteClient.AgentId) if (remoteClient != null && item.Owner == remoteClient.AgentId)
{ {
@ -2053,7 +1817,7 @@ namespace OpenSim.Region.Framework.Scenes
return assetID; return assetID;
} }
public void updateKnownAsset(IClientAPI remoteClient, SceneObjectGroup grp, UUID assetID, UUID agentID) public void UpdateKnownItem(IClientAPI remoteClient, SceneObjectGroup grp, UUID itemID, UUID agentID)
{ {
SceneObjectGroup objectGroup = grp; SceneObjectGroup objectGroup = grp;
if (objectGroup != null) if (objectGroup != null)
@ -2070,43 +1834,9 @@ namespace OpenSim.Region.Framework.Scenes
string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(objectGroup); string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(objectGroup);
CachedUserInfo userInfo = InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID));
CommsManager.UserProfileCacheService.GetUserDetails(agentID);
if (userInfo != null && userInfo.RootFolder != null)
{
Queue<InventoryFolderImpl> searchfolders = new Queue<InventoryFolderImpl>();
searchfolders.Enqueue(userInfo.RootFolder);
UUID foundFolder = UUID.Zero; if (item != null)
InventoryItemBase item = null;
// search through folders to find the asset.
while (searchfolders.Count > 0)
{
InventoryFolderImpl fld = searchfolders.Dequeue();
lock (fld)
{
if (fld != null)
{
if (fld.Items.ContainsKey(assetID))
{
item = fld.Items[assetID];
foundFolder = fld.ID;
searchfolders.Clear();
break;
}
else
{
foreach (InventoryFolderImpl subfld in fld.RequestListOfFolderImpls())
{
searchfolders.Enqueue(subfld);
}
}
}
}
}
if (foundFolder != UUID.Zero && item != null)
{ {
AssetBase asset = CreateAsset( AssetBase asset = CreateAsset(
objectGroup.GetPartName(objectGroup.LocalId), objectGroup.GetPartName(objectGroup.LocalId),
@ -2120,9 +1850,8 @@ namespace OpenSim.Region.Framework.Scenes
item.Name = asset.Name; item.Name = asset.Name;
item.AssetType = asset.Type; item.AssetType = asset.Type;
item.InvType = (int)InventoryType.Object; item.InvType = (int)InventoryType.Object;
item.Folder = foundFolder;
userInfo.UpdateItem(item); InventoryService.UpdateItem(item);
// this gets called when the agent loggs off! // this gets called when the agent loggs off!
if (remoteClient != null) if (remoteClient != null)
@ -2132,7 +1861,6 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
} }
}
public UUID attachObjectAssetStore(IClientAPI remoteClient, SceneObjectGroup grp, UUID AgentId, out UUID itemID) public UUID attachObjectAssetStore(IClientAPI remoteClient, SceneObjectGroup grp, UUID AgentId, out UUID itemID)
{ {
@ -2141,11 +1869,6 @@ namespace OpenSim.Region.Framework.Scenes
{ {
string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp);
CachedUserInfo userInfo =
CommsManager.UserProfileCacheService.GetUserDetails(AgentId);
if (userInfo != null)
{
AssetBase asset = CreateAsset( AssetBase asset = CreateAsset(
grp.GetPartName(grp.LocalId), grp.GetPartName(grp.LocalId),
grp.GetPartDescription(grp.LocalId), grp.GetPartDescription(grp.LocalId),
@ -2183,19 +1906,19 @@ namespace OpenSim.Region.Framework.Scenes
} }
item.CreationDate = Util.UnixTimeSinceEpoch(); item.CreationDate = Util.UnixTimeSinceEpoch();
// sets assetID so client can show asset as 'attached' in inventory // sets itemID so client can show item as 'attached' in inventory
grp.SetFromAssetID(item.ID); grp.SetFromItemID(item.ID);
userInfo.AddItem(item); if (InventoryService.AddItem(item))
remoteClient.SendInventoryItemCreateUpdate(item, 0); remoteClient.SendInventoryItemCreateUpdate(item, 0);
else
m_dialogModule.SendAlertToUser(remoteClient, "Operation failed");
itemID = item.ID; itemID = item.ID;
return item.AssetID; return item.AssetID;
} }
return UUID.Zero; return UUID.Zero;
} }
return UUID.Zero;
}
/// <summary> /// <summary>
/// Event Handler Rez an object into a scene /// Event Handler Rez an object into a scene
@ -2261,17 +1984,7 @@ namespace OpenSim.Region.Framework.Scenes
BypassRayCast, bRayEndIsIntersection,true,scale, false); BypassRayCast, bRayEndIsIntersection,true,scale, false);
// Rez object // Rez object
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID));
if (userInfo != null)
{
// Do NOT use HasReceivedInventory here, this is called
// from within ItemReceive during login for attachments.
// Using HasReceivedInventory here will break attachment
// persistence!
//
if (userInfo.RootFolder != null)
{
InventoryItemBase item = userInfo.RootFolder.FindItem(itemID);
if (item != null) if (item != null)
{ {
@ -2331,7 +2044,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
else else
{ {
group.SetFromAssetID(itemID); group.SetFromItemID(itemID);
} }
SceneObjectPart rootPart = null; SceneObjectPart rootPart = null;
@ -2422,19 +2135,13 @@ namespace OpenSim.Region.Framework.Scenes
// copy ones will be lost, so avoid it // copy ones will be lost, so avoid it
// //
if (!attachment) if (!attachment)
userInfo.DeleteItem(item.ID); InventoryService.DeleteItem(item);
} }
} }
return rootPart.ParentGroup; return rootPart.ParentGroup;
} }
} }
}
else
m_log.WarnFormat("[AGENT INVENTORY]: Root folder not found in {0}", RegionInfo.RegionName);
}
else
m_log.WarnFormat("[AGENT INVENTORY]: User profile not found in {0}", RegionInfo.RegionName);
return null; return null;
} }
@ -2666,7 +2373,7 @@ namespace OpenSim.Region.Framework.Scenes
if (part == null || part.ParentGroup == null) if (part == null || part.ParentGroup == null)
return; return;
UUID inventoryID = part.ParentGroup.GetFromAssetID(); UUID inventoryID = part.ParentGroup.GetFromItemID();
ScenePresence presence; ScenePresence presence;
if (TryGetAvatar(remoteClient.AgentId, out presence)) if (TryGetAvatar(remoteClient.AgentId, out presence))
@ -2681,14 +2388,10 @@ namespace OpenSim.Region.Framework.Scenes
ava.UpdateDatabase(remoteClient.AgentId, presence.Appearance); ava.UpdateDatabase(remoteClient.AgentId, presence.Appearance);
} }
part.ParentGroup.DetachToGround(); part.ParentGroup.DetachToGround();
CachedUserInfo userInfo =
CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); InventoryService.DeleteItem(new InventoryItemBase(inventoryID));
if (userInfo != null)
{
userInfo.DeleteItem(inventoryID);
remoteClient.SendRemoveInventoryItem(inventoryID); remoteClient.SendRemoveInventoryItem(inventoryID);
} }
}
SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero); SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero);
} }

View File

@ -382,31 +382,13 @@ namespace OpenSim.Region.Framework.Scenes
return; return;
} }
CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID));
if (null == userProfile)
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Could not find user profile for {0} {1}",
remoteClient.Name, remoteClient.AgentId);
return;
}
if (userProfile.HasReceivedInventory)
{
InventoryItemBase item = null;
if (userProfile.RootFolder == null)
m_log.ErrorFormat(
"[AGENT INVENTORY]: User {0} {1} does not have a root folder.",
remoteClient.Name, remoteClient.AgentId);
else
item = userProfile.RootFolder.FindItem(itemID);
if (item != null) if (item != null)
{ {
remoteClient.SendInventoryItemDetails(ownerID, item); remoteClient.SendInventoryItemDetails(ownerID, item);
} }
} // else shouldn't we send an alert message?
} }
/// <summary> /// <summary>
@ -435,23 +417,14 @@ namespace OpenSim.Region.Framework.Scenes
return; return;
} }
CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems);
if (null == userProfile)
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Could not find user profile for {0} {1}",
remoteClient.Name, remoteClient.AgentId);
return;
}
userProfile.SendInventoryDecendents(remoteClient, folderID, fetchFolders, fetchItems);
} }
/// <summary> /// <summary>
/// Handle the caps inventory descendents fetch. /// Handle the caps inventory descendents fetch.
/// ///
/// Since the folder structure is sent to the client on login, I believe we only need to handle items. /// Since the folder structure is sent to the client on login, I believe we only need to handle items.
/// Diva comment 8/13/2009: what if someone gave us a folder in the meantime??
/// </summary> /// </summary>
/// <param name="agentID"></param> /// <param name="agentID"></param>
/// <param name="folderID"></param> /// <param name="folderID"></param>
@ -478,58 +451,9 @@ namespace OpenSim.Region.Framework.Scenes
return fold.RequestListOfItems(); return fold.RequestListOfItems();
} }
CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(agentID); InventoryCollection contents = InventoryService.GetFolderContent(agentID, folderID);
return contents.Items;
if (null == userProfile)
{
m_log.ErrorFormat("[AGENT INVENTORY]: Could not find user profile for {0}", agentID);
return null;
}
// XXX: When a client crosses into a scene, their entire inventory is fetched
// asynchronously. If the client makes a request before the inventory is received, we need
// to give the inventory a chance to come in.
//
// This is a crude way of dealing with that by retrying the lookup. It's not quite as bad
// in CAPS as doing this with the udp request, since here it won't hold up other packets.
// In fact, here we'll be generous and try for longer.
if (!userProfile.HasReceivedInventory)
{
int attempts = 0;
while (attempts++ < 30)
{
m_log.DebugFormat(
"[INVENTORY CACHE]: Poll number {0} for inventory items in folder {1} for user {2}",
attempts, folderID, agentID);
Thread.Sleep(2000);
if (userProfile.HasReceivedInventory)
{
break;
}
}
}
if (userProfile.HasReceivedInventory)
{
if ((fold = userProfile.RootFolder.FindFolder(folderID)) != null)
{
return fold.RequestListOfItems();
}
else
{
m_log.WarnFormat(
"[AGENT INVENTORY]: Could not find folder {0} requested by user {1}",
folderID, agentID);
return null;
}
}
else
{
m_log.ErrorFormat("[INVENTORY CACHE]: Could not find root folder for user {0}", agentID);
return null;
}
} }
/// <summary> /// <summary>
@ -543,19 +467,10 @@ namespace OpenSim.Region.Framework.Scenes
public void HandleCreateInventoryFolder(IClientAPI remoteClient, UUID folderID, ushort folderType, public void HandleCreateInventoryFolder(IClientAPI remoteClient, UUID folderID, ushort folderType,
string folderName, UUID parentID) string folderName, UUID parentID)
{ {
CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); InventoryFolderBase folder = new InventoryFolderBase(folderID, folderName, remoteClient.AgentId, (short)folderType, parentID, 1);
if (!InventoryService.AddFolder(folder))
if (null == userProfile)
{ {
m_log.ErrorFormat( m_log.WarnFormat(
"[AGENT INVENTORY]: Could not find user profile for {0} {1}",
remoteClient.Name, remoteClient.AgentId);
return;
}
if (!userProfile.CreateFolder(folderName, folderID, folderType, parentID))
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Failed to move create folder for user {0} {1}", "[AGENT INVENTORY]: Failed to move create folder for user {0} {1}",
remoteClient.Name, remoteClient.AgentId); remoteClient.Name, remoteClient.AgentId);
} }
@ -598,36 +513,10 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
/// <summary>
/// Handle an inventory folder move request from the client.
/// </summary>
/// <param name="remoteClient"></param>
/// <param name="folderID"></param>
/// <param name="parentID"></param>
public void HandleMoveInventoryFolder(IClientAPI remoteClient, UUID folderID, UUID parentID) public void HandleMoveInventoryFolder(IClientAPI remoteClient, UUID folderID, UUID parentID)
{
CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (null == userProfile)
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Could not find user profile for {0} {1}",
remoteClient.Name, remoteClient.AgentId);
return;
}
if (!userProfile.MoveFolder(folderID, parentID))
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Failed to move folder {0} to {1} for user {2}",
folderID, parentID, remoteClient.Name);
}
}
public void HandleMoveInventoryFolder2(IClientAPI remoteClient, UUID folderID, UUID parentID)
{ {
InventoryFolderBase folder = new InventoryFolderBase(folderID); InventoryFolderBase folder = new InventoryFolderBase(folderID);
folder = InventoryService.QueryFolder(folder); folder = InventoryService.GetFolder(folder);
if (folder != null) if (folder != null)
{ {
folder.ParentID = parentID; folder.ParentID = parentID;
@ -647,27 +536,8 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>
/// <param name="folderID"></param> /// <param name="folderID"></param>
public void HandlePurgeInventoryDescendents(IClientAPI remoteClient, UUID folderID) public void HandlePurgeInventoryDescendents(IClientAPI remoteClient, UUID folderID)
{
CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (null == userProfile)
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Could not find user profile for {0} {1}",
remoteClient.Name, remoteClient.AgentId);
return;
}
if (!userProfile.PurgeFolder(folderID))
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Failed to purge folder for user {0} {1}",
remoteClient.Name, remoteClient.AgentId);
}
}
public void HandlePurgeInventoryDescendents2(IClientAPI remoteClient, UUID folderID)
{ {
InventoryFolderBase folder = new InventoryFolderBase(folderID); InventoryFolderBase folder = new InventoryFolderBase(folderID);

View File

@ -1962,7 +1962,7 @@ namespace OpenSim.Region.Framework.Scenes
m_log.DebugFormat("[ATTACHMENT]: Received " + m_log.DebugFormat("[ATTACHMENT]: Received " +
"attachment {0}, inworld asset id {1}", "attachment {0}, inworld asset id {1}",
//grp.RootPart.LastOwnerID.ToString(), //grp.RootPart.LastOwnerID.ToString(),
grp.GetFromAssetID(), grp.GetFromItemID(),
grp.UUID.ToString()); grp.UUID.ToString());
//grp.SetFromAssetID(grp.RootPart.LastOwnerID); //grp.SetFromAssetID(grp.RootPart.LastOwnerID);
@ -3672,11 +3672,6 @@ namespace OpenSim.Region.Framework.Scenes
case 2: // Sell a copy case 2: // Sell a copy
string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(group); string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(group);
CachedUserInfo userInfo =
CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (userInfo != null)
{
uint perms=group.GetEffectivePermissions(); uint perms=group.GetEffectivePermissions();
if ((perms & (uint)PermissionMask.Transfer) == 0) if ((perms & (uint)PermissionMask.Transfer) == 0)
@ -3722,9 +3717,8 @@ namespace OpenSim.Region.Framework.Scenes
item.CurrentPermissions |= 8; // Slam! item.CurrentPermissions |= 8; // Slam!
item.CreationDate = Util.UnixTimeSinceEpoch(); item.CreationDate = Util.UnixTimeSinceEpoch();
userInfo.AddItem(item); if (InventoryService.AddItem(item))
remoteClient.SendInventoryItemCreateUpdate(item, 0); remoteClient.SendInventoryItemCreateUpdate(item, 0);
}
else else
{ {
m_dialogModule.SendAlertToUser(remoteClient, "Cannot buy now. Your inventory is unavailable"); m_dialogModule.SendAlertToUser(remoteClient, "Cannot buy now. Your inventory is unavailable");
@ -3739,8 +3733,8 @@ namespace OpenSim.Region.Framework.Scenes
foreach (UUID invID in invList) foreach (UUID invID in invList)
{ {
TaskInventoryItem item = part.Inventory.GetInventoryItem(invID); TaskInventoryItem item1 = part.Inventory.GetInventoryItem(invID);
if ((item.CurrentPermissions & if ((item1.CurrentPermissions &
(uint)PermissionMask.Transfer) == 0) (uint)PermissionMask.Transfer) == 0)
{ {
okToSell = false; okToSell = false;

View File

@ -1086,11 +1086,11 @@ namespace OpenSim.Region.Framework.Scenes
public bool WaitForCallback(UUID id) public bool WaitForCallback(UUID id)
{ {
int count = 20; int count = 200;
while (m_agentsInTransit.Contains(id) && count-- > 0) while (m_agentsInTransit.Contains(id) && count-- > 0)
{ {
//m_log.Debug(" >>> Waiting... " + count); //m_log.Debug(" >>> Waiting... " + count);
Thread.Sleep(1000); Thread.Sleep(100);
} }
if (count > 0) if (count > 0)
@ -1207,16 +1207,16 @@ namespace OpenSim.Region.Framework.Scenes
{ {
pos = pos + (agent.Velocity); pos = pos + (agent.Velocity);
CachedUserInfo userInfo = m_commsProvider.UserProfileCacheService.GetUserDetails(agent.UUID); //CachedUserInfo userInfo = m_commsProvider.UserProfileCacheService.GetUserDetails(agent.UUID);
if (userInfo != null) //if (userInfo != null)
{ //{
userInfo.DropInventory(); // userInfo.DropInventory();
} //}
else //else
{ //{
m_log.WarnFormat("[SCENE COMM]: No cached user info found for {0} {1} on leaving region {2}", // m_log.WarnFormat("[SCENE COMM]: No cached user info found for {0} {1} on leaving region {2}",
agent.Name, agent.UUID, agent.Scene.RegionInfo.RegionName); // agent.Name, agent.UUID, agent.Scene.RegionInfo.RegionName);
} //}
//bool crossingSuccessful = //bool crossingSuccessful =
// CrossToNeighbouringRegion(neighbourHandle, agent.ControllingClient.AgentId, pos, // CrossToNeighbouringRegion(neighbourHandle, agent.ControllingClient.AgentId, pos,
@ -1315,11 +1315,11 @@ namespace OpenSim.Region.Framework.Scenes
} }
else // Not successful else // Not successful
{ {
CachedUserInfo userInfo = m_commsProvider.UserProfileCacheService.GetUserDetails(agent.UUID); //CachedUserInfo userInfo = m_commsProvider.UserProfileCacheService.GetUserDetails(agent.UUID);
if (userInfo != null) //if (userInfo != null)
{ //{
userInfo.FetchInventory(); // userInfo.FetchInventory();
} //}
agent.RestoreInCurrentScene(); agent.RestoreInCurrentScene();
} }
// In any case // In any case

View File

@ -442,7 +442,7 @@ namespace OpenSim.Region.Framework.Scenes
if (group != null) if (group != null)
{ {
//group.DetachToGround(); //group.DetachToGround();
m_parentScene.DetachSingleAttachmentToInv(group.GetFromAssetID(), remoteClient); m_parentScene.DetachSingleAttachmentToInv(group.GetFromItemID(), remoteClient);
} }
} }
@ -489,7 +489,7 @@ namespace OpenSim.Region.Framework.Scenes
// Calls attach with a Zero position // Calls attach with a Zero position
// //
AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false); AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false);
m_parentScene.SendAttachEvent(objectLocalID, part.ParentGroup.GetFromAssetID(), remoteClient.AgentId); m_parentScene.SendAttachEvent(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId);
} }
public SceneObjectGroup RezSingleAttachment( public SceneObjectGroup RezSingleAttachment(
@ -536,14 +536,14 @@ namespace OpenSim.Region.Framework.Scenes
if (entity is SceneObjectGroup) if (entity is SceneObjectGroup)
{ {
group = (SceneObjectGroup)entity; group = (SceneObjectGroup)entity;
if (group.GetFromAssetID() == itemID) if (group.GetFromItemID() == itemID)
{ {
m_parentScene.SendAttachEvent(group.LocalId, itemID, UUID.Zero); m_parentScene.SendAttachEvent(group.LocalId, itemID, UUID.Zero);
group.DetachToInventoryPrep(); group.DetachToInventoryPrep();
m_log.Debug("[DETACH]: Saving attachpoint: " + m_log.Debug("[DETACH]: Saving attachpoint: " +
((uint)group.GetAttachmentPoint()).ToString()); ((uint)group.GetAttachmentPoint()).ToString());
m_parentScene.updateKnownAsset(remoteClient, group, m_parentScene.UpdateKnownItem(remoteClient, group,
group.GetFromAssetID(), group.OwnerID); group.GetFromItemID(), group.OwnerID);
m_parentScene.DeleteSceneObject(group, false); m_parentScene.DeleteSceneObject(group, false);
return; return;
} }
@ -588,13 +588,13 @@ namespace OpenSim.Region.Framework.Scenes
// Saves and gets assetID // Saves and gets assetID
UUID itemId; UUID itemId;
if (group.GetFromAssetID() == UUID.Zero) if (group.GetFromItemID() == UUID.Zero)
{ {
m_parentScene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemId); m_parentScene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemId);
} }
else else
{ {
itemId = group.GetFromAssetID(); itemId = group.GetFromItemID();
} }
m_parentScene.AttachObject(remoteClient, AttachmentPt, itemId, group); m_parentScene.AttachObject(remoteClient, AttachmentPt, itemId, group);
@ -1307,7 +1307,7 @@ namespace OpenSim.Region.Framework.Scenes
group.UpdateGroupPosition(pos); group.UpdateGroupPosition(pos);
group.RootPart.IsAttachment = false; group.RootPart.IsAttachment = false;
group.AbsolutePosition = group.RootPart.AttachedPos; group.AbsolutePosition = group.RootPart.AttachedPos;
m_parentScene.updateKnownAsset(remoteClient, group, group.GetFromAssetID(), group.OwnerID); m_parentScene.UpdateKnownItem(remoteClient, group, group.GetFromItemID(), group.OwnerID);
group.SetAttachmentPoint(attachmentPoint); group.SetAttachmentPoint(attachmentPoint);
} }

View File

@ -447,22 +447,22 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
public void SetFromAssetID(UUID AssetId) public void SetFromItemID(UUID AssetId)
{ {
lock (m_parts) lock (m_parts)
{ {
foreach (SceneObjectPart part in m_parts.Values) foreach (SceneObjectPart part in m_parts.Values)
{ {
part.FromAssetID = AssetId; part.FromItemID = AssetId;
} }
} }
} }
public UUID GetFromAssetID() public UUID GetFromItemID()
{ {
if (m_rootPart != null) if (m_rootPart != null)
{ {
return m_rootPart.FromAssetID; return m_rootPart.FromItemID;
} }
return UUID.Zero; return UUID.Zero;
} }
@ -3374,19 +3374,19 @@ namespace OpenSim.Region.Framework.Scenes
public virtual string ExtraToXmlString() public virtual string ExtraToXmlString()
{ {
return "<ExtraFromAssetID>" + GetFromAssetID().ToString() + "</ExtraFromAssetID>"; return "<ExtraFromItemID>" + GetFromItemID().ToString() + "</ExtraFromItemID>";
} }
public virtual void ExtraFromXmlString(string xmlstr) public virtual void ExtraFromXmlString(string xmlstr)
{ {
string id = xmlstr.Substring(xmlstr.IndexOf("<ExtraFromAssetID>")); string id = xmlstr.Substring(xmlstr.IndexOf("<ExtraFromItemID>"));
id = xmlstr.Replace("<ExtraFromAssetID>", ""); id = xmlstr.Replace("<ExtraFromItemID>", "");
id = id.Replace("</ExtraFromAssetID>", ""); id = id.Replace("</ExtraFromItemID>", "");
UUID uuid = UUID.Zero; UUID uuid = UUID.Zero;
UUID.TryParse(id, out uuid); UUID.TryParse(id, out uuid);
SetFromAssetID(uuid); SetFromItemID(uuid);
} }
#endregion #endregion

View File

@ -139,7 +139,7 @@ namespace OpenSim.Region.Framework.Scenes
public uint TimeStampTerse = 0; public uint TimeStampTerse = 0;
[XmlIgnore] [XmlIgnore]
public UUID FromAssetID = UUID.Zero; public UUID FromItemID = UUID.Zero;
/// <value> /// <value>
/// The UUID of the user inventory item from which this object was rezzed if this is a root part. /// The UUID of the user inventory item from which this object was rezzed if this is a root part.
@ -2389,7 +2389,7 @@ if (m_shape != null) {
remoteClient.SendPrimitiveToClient(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, m_shape, remoteClient.SendPrimitiveToClient(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, m_shape,
lPos, Velocity, Acceleration, RotationOffset, RotationalVelocity, clientFlags, m_uuid, _ownerID, lPos, Velocity, Acceleration, RotationOffset, RotationalVelocity, clientFlags, m_uuid, _ownerID,
m_text, color, _parentID, m_particleSystem, m_clickAction, (byte)m_material, m_TextureAnimation, IsAttachment, m_text, color, _parentID, m_particleSystem, m_clickAction, (byte)m_material, m_TextureAnimation, IsAttachment,
AttachmentPoint,FromAssetID, Sound, SoundGain, SoundFlags, SoundRadius); AttachmentPoint,FromItemID, Sound, SoundGain, SoundFlags, SoundRadius);
} }
/// <summary> /// <summary>
@ -3767,7 +3767,7 @@ if (m_shape != null) {
(ushort)(m_parentGroup.GetTimeDilation() * (ushort)(m_parentGroup.GetTimeDilation() *
(float)ushort.MaxValue), LocalId, lPos, (float)ushort.MaxValue), LocalId, lPos,
RotationOffset, Velocity, RotationOffset, Velocity,
RotationalVelocity, state, FromAssetID, RotationalVelocity, state, FromItemID,
OwnerID, (int)AttachmentPoint); OwnerID, (int)AttachmentPoint);
} }

View File

@ -833,11 +833,11 @@ namespace OpenSim.Region.Framework.Scenes
m_scene.SwapRootAgentCount(false); m_scene.SwapRootAgentCount(false);
CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(m_uuid); //CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(m_uuid);
if (userInfo != null) //if (userInfo != null)
userInfo.FetchInventory(); // userInfo.FetchInventory();
else //else
m_log.ErrorFormat("[SCENE]: Could not find user info for {0} when making it a root agent", m_uuid); // m_log.ErrorFormat("[SCENE]: Could not find user info for {0} when making it a root agent", m_uuid);
// On the next prim update, all objects will be sent // On the next prim update, all objects will be sent
// //

View File

@ -2801,7 +2801,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
{ {
SceneObjectGroup grp = m_host.ParentGroup; SceneObjectGroup grp = m_host.ParentGroup;
UUID itemID = grp.GetFromAssetID(); UUID itemID = grp.GetFromItemID();
ScenePresence presence = World.GetScenePresence(m_host.OwnerID); ScenePresence presence = World.GetScenePresence(m_host.OwnerID);

View File

@ -110,11 +110,11 @@ namespace OpenSim.Server.Handlers.Inventory
m_httpServer.AddStreamHandler( m_httpServer.AddStreamHandler(
new RestDeserialiseSecureHandler<InventoryItemBase, InventoryItemBase>( new RestDeserialiseSecureHandler<InventoryItemBase, InventoryItemBase>(
"POST", "/QueryItem/", m_InventoryService.QueryItem, CheckAuthSession)); "POST", "/QueryItem/", m_InventoryService.GetItem, CheckAuthSession));
m_httpServer.AddStreamHandler( m_httpServer.AddStreamHandler(
new RestDeserialiseSecureHandler<InventoryFolderBase, InventoryFolderBase>( new RestDeserialiseSecureHandler<InventoryFolderBase, InventoryFolderBase>(
"POST", "/QueryFolder/", m_InventoryService.QueryFolder, CheckAuthSession)); "POST", "/QueryFolder/", m_InventoryService.GetFolder, CheckAuthSession));
m_httpServer.AddStreamHandler( m_httpServer.AddStreamHandler(
new RestDeserialiseTrustedHandler<Guid, bool>( new RestDeserialiseTrustedHandler<Guid, bool>(
@ -153,6 +153,11 @@ namespace OpenSim.Server.Handlers.Inventory
m_httpServer.AddStreamHandler( m_httpServer.AddStreamHandler(
new RestDeserialiseTrustedHandler<Guid, List<InventoryFolderBase>> new RestDeserialiseTrustedHandler<Guid, List<InventoryFolderBase>>
("POST", "/RootFolders/", GetInventorySkeleton, CheckTrustSource)); ("POST", "/RootFolders/", GetInventorySkeleton, CheckTrustSource));
m_httpServer.AddStreamHandler(
new RestDeserialiseTrustedHandler<InventoryItemBase, int>
("POST", "/AssetPermissions/", GetAssetPermissions, CheckTrustSource));
} }
#region Wrappers for converting the Guid parameter #region Wrappers for converting the Guid parameter
@ -185,6 +190,8 @@ namespace OpenSim.Server.Handlers.Inventory
if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown)) if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown))
folders[(AssetType)folder.Type] = folder; folders[(AssetType)folder.Type] = folder;
} }
// Put the root folder there, as type Folder
folders[AssetType.Folder] = root;
return folders; return folders;
} }
} }
@ -235,6 +242,11 @@ namespace OpenSim.Server.Handlers.Inventory
return m_InventoryService.GetInventorySkeleton(userID); return m_InventoryService.GetInventorySkeleton(userID);
} }
public int GetAssetPermissions(InventoryItemBase item)
{
return m_InventoryService.GetAssetPermissions(item.Owner, item.AssetID);
}
#endregion #endregion
/// <summary> /// <summary>

View File

@ -149,7 +149,7 @@ namespace OpenSim.Services.Connectors.Inventory
/// <returns></returns> /// <returns></returns>
public InventoryCollection GetFolderContent(string id, UUID folderID, UUID sessionID) public InventoryCollection GetFolderContent(string id, UUID folderID, UUID sessionID)
{ {
m_log.Debug("[HGInventory]: GetSystemFolders " + id); m_log.Debug("[HGInventory]: GetFolderContent " + id);
string url = string.Empty; string url = string.Empty;
string userID = string.Empty; string userID = string.Empty;
@ -279,5 +279,17 @@ namespace OpenSim.Services.Connectors.Inventory
return null; return null;
} }
public int GetAssetPermissions(string id, UUID assetID, UUID sessionID)
{
string url = string.Empty;
string userID = string.Empty;
if (StringToUrlAndUserID(id, out url, out userID))
{
ISessionAuthInventoryService connector = GetConnector(url);
return connector.GetAssetPermissions(userID, assetID, sessionID);
}
return 0;
}
} }
} }

View File

@ -120,5 +120,7 @@ namespace OpenSim.Services.Connectors
InventoryFolderBase QueryFolder(string userID, InventoryFolderBase item, UUID session_id); InventoryFolderBase QueryFolder(string userID, InventoryFolderBase item, UUID session_id);
int GetAssetPermissions(string userID, UUID assetID, UUID session_id);
} }
} }

View File

@ -163,21 +163,21 @@ namespace OpenSim.Services.Connectors
/// <returns></returns> /// <returns></returns>
public Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(string userID, UUID sessionID) public Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(string userID, UUID sessionID)
{ {
// !!! Not just yet. try
//try {
//{ List<InventoryFolderBase> folders = SynchronousRestSessionObjectPoster<Guid, List<InventoryFolderBase>>.BeginPostObject(
// List<InventoryFolderBase> folders = SynchronousRestSessionObjectPoster<Guid, List<InventoryFolderBase>>.BeginPostObject( "POST", m_ServerURI + "/SystemFolders/", new Guid(userID), sessionID.ToString(), userID.ToString());
// "POST", m_ServerURI + "/SystemFolders/", new Guid(userID), sessionID.ToString(), userID.ToString());
// Dictionary<AssetType, InventoryFolderBase> dFolders = new Dictionary<AssetType, InventoryFolderBase>(); Dictionary<AssetType, InventoryFolderBase> dFolders = new Dictionary<AssetType, InventoryFolderBase>();
// foreach (InventoryFolderBase f in folders) foreach (InventoryFolderBase f in folders)
// dFolders[(AssetType)f.Type] = f; dFolders[(AssetType)f.Type] = f;
// return dFolders; return dFolders;
//} }
//catch (Exception e) catch (Exception e)
//{ {
// m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetSystemFolders operation failed, {0} {1}", m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetSystemFolders operation failed, {0} {1}",
// e.Source, e.Message); e.Source, e.Message);
//} }
return new Dictionary<AssetType, InventoryFolderBase>(); return new Dictionary<AssetType, InventoryFolderBase>();
} }
@ -348,6 +348,25 @@ namespace OpenSim.Services.Connectors
return null; return null;
} }
public int GetAssetPermissions(string userID, UUID assetID, UUID sessionID)
{
try
{
InventoryItemBase item = new InventoryItemBase();
item.Owner = new UUID(userID);
item.AssetID = assetID;
return SynchronousRestSessionObjectPoster<InventoryItemBase, int>.BeginPostObject(
"POST", m_ServerURI + "/AssetPermissions/", item, sessionID.ToString(), userID);
}
catch (Exception e)
{
m_log.ErrorFormat("[INVENTORY CONNECTOR]: AssetPermissions operation failed, {0} {1}",
e.Source, e.Message);
}
return 0;
}
#endregion #endregion
/// <summary> /// <summary>

View File

@ -156,12 +156,12 @@ namespace OpenSim.Services.Connectors
return false; return false;
} }
public InventoryItemBase QueryItem(InventoryItemBase item) public InventoryItemBase GetItem(InventoryItemBase item)
{ {
return null; return null;
} }
public InventoryFolderBase QueryFolder(InventoryFolderBase folder) public InventoryFolderBase GetFolder(InventoryFolderBase folder)
{ {
return null; return null;
} }
@ -176,5 +176,10 @@ namespace OpenSim.Services.Connectors
return null; return null;
} }
public int GetAssetPermissions(UUID userID, UUID assetID)
{
return 0;
}
} }
} }

View File

@ -149,9 +149,19 @@ namespace OpenSim.Services.Interfaces
/// <returns>true if the item was successfully deleted</returns> /// <returns>true if the item was successfully deleted</returns>
bool DeleteItem(InventoryItemBase item); bool DeleteItem(InventoryItemBase item);
InventoryItemBase QueryItem(InventoryItemBase item); /// <summary>
/// Get an item, given by its UUID
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
InventoryItemBase GetItem(InventoryItemBase item);
InventoryFolderBase QueryFolder(InventoryFolderBase folder); /// <summary>
/// Get a folder, given by its UUID
/// </summary>
/// <param name="folder"></param>
/// <returns></returns>
InventoryFolderBase GetFolder(InventoryFolderBase folder);
/// <summary> /// <summary>
/// Does the given user have an inventory structure? /// Does the given user have an inventory structure?
@ -166,5 +176,15 @@ namespace OpenSim.Services.Interfaces
/// <param name="userId"></param> /// <param name="userId"></param>
/// <returns></returns> /// <returns></returns>
List<InventoryItemBase> GetActiveGestures(UUID userId); List<InventoryItemBase> GetActiveGestures(UUID userId);
/// <summary>
/// Get the union of permissions of all inventory items
/// that hold the given assetID.
/// </summary>
/// <param name="userID"></param>
/// <param name="assetID"></param>
/// <returns>The permissions or 0 if no such asset is found in
/// the user's inventory</returns>
int GetAssetPermissions(UUID userID, UUID assetID);
} }
} }

View File

@ -398,7 +398,7 @@ namespace OpenSim.Services.InventoryService
return true; return true;
} }
public virtual InventoryItemBase QueryItem(InventoryItemBase item) public virtual InventoryItemBase GetItem(InventoryItemBase item)
{ {
InventoryItemBase result = m_Database.queryInventoryItem(item.ID); InventoryItemBase result = m_Database.queryInventoryItem(item.ID);
if (result != null) if (result != null)
@ -407,7 +407,7 @@ namespace OpenSim.Services.InventoryService
return null; return null;
} }
public virtual InventoryFolderBase QueryFolder(InventoryFolderBase item) public virtual InventoryFolderBase GetFolder(InventoryFolderBase item)
{ {
InventoryFolderBase result = m_Database.queryInventoryFolder(item.ID); InventoryFolderBase result = m_Database.queryInventoryFolder(item.ID);
if (result != null) if (result != null)
@ -465,6 +465,29 @@ namespace OpenSim.Services.InventoryService
return null; return null;
} }
public int GetAssetPermissions(UUID userID, UUID assetID)
{
InventoryFolderBase parent = GetRootFolder(userID);
return FindAssetPerms(parent, assetID);
}
private int FindAssetPerms(InventoryFolderBase folder, UUID assetID)
{
InventoryCollection contents = GetFolderContent(folder.Owner, folder.ID);
int perms = 0;
foreach (InventoryItemBase item in contents.Items)
{
if (item.AssetID == assetID)
perms = (int)item.CurrentPermissions | perms;
}
foreach (InventoryFolderBase subfolder in contents.Folders)
perms = perms | FindAssetPerms(subfolder, assetID);
return perms;
}
/// <summary> /// <summary>
/// Used to create a new user inventory. /// Used to create a new user inventory.
/// </summary> /// </summary>

View File

@ -148,12 +148,12 @@ namespace OpenSim.Tests.Common.Mock
return false; return false;
} }
public InventoryItemBase QueryItem(InventoryItemBase item) public InventoryItemBase GetItem(InventoryItemBase item)
{ {
return null; return null;
} }
public InventoryFolderBase QueryFolder(InventoryFolderBase folder) public InventoryFolderBase GetFolder(InventoryFolderBase folder)
{ {
return null; return null;
} }
@ -171,5 +171,10 @@ namespace OpenSim.Tests.Common.Mock
root.ParentID = UUID.Zero; root.ParentID = UUID.Zero;
return root; return root;
} }
public int GetAssetPermissions(UUID userID, UUID assetID)
{
return 1;
}
} }
} }