mirror of
https://github.com/opensim/opensim.git
synced 2026-08-08 02:05:34 +08:00
Added MoveItems, which is most useful upon viewer-delete inventory operation. Moving a batch of items is a 1-time operation. Made it async anyway, so that the viewer doesn't wait in case the DB layer is dumb (which is the case currently).
This commit is contained in:
@@ -7027,14 +7027,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
if (OnMoveInventoryItem != null)
|
||||
{
|
||||
handlerMoveInventoryItem = null;
|
||||
InventoryItemBase itm = null;
|
||||
List<InventoryItemBase> items = new List<InventoryItemBase>();
|
||||
foreach (MoveInventoryItemPacket.InventoryDataBlock datablock in moveitem.InventoryData)
|
||||
{
|
||||
handlerMoveInventoryItem = OnMoveInventoryItem;
|
||||
if (handlerMoveInventoryItem != null)
|
||||
{
|
||||
handlerMoveInventoryItem(this, datablock.FolderID, datablock.ItemID, datablock.Length,
|
||||
Util.FieldToString(datablock.NewName));
|
||||
}
|
||||
itm = new InventoryItemBase(datablock.ItemID, AgentId);
|
||||
itm.Folder = datablock.FolderID;
|
||||
itm.Name = Util.FieldToString(datablock.NewName);
|
||||
// weird, comes out as empty string
|
||||
//m_log.DebugFormat("[XXX] new name: {0}", itm.Name);
|
||||
items.Add(itm);
|
||||
}
|
||||
handlerMoveInventoryItem = OnMoveInventoryItem;
|
||||
if (handlerMoveInventoryItem != null)
|
||||
{
|
||||
handlerMoveInventoryItem(this, items);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -181,6 +181,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||
/// <returns>true if the item was successfully updated</returns>
|
||||
public abstract bool UpdateItem(InventoryItemBase item);
|
||||
|
||||
public abstract bool MoveItems(UUID ownerID, List<InventoryItemBase> items);
|
||||
|
||||
/// <summary>
|
||||
/// Delete an item from the user's inventory
|
||||
/// </summary>
|
||||
|
||||
@@ -393,6 +393,23 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||
}
|
||||
}
|
||||
|
||||
public override bool MoveItems(UUID ownerID, List<InventoryItemBase> items)
|
||||
{
|
||||
if (items == null)
|
||||
return false;
|
||||
if (items.Count == 0)
|
||||
return true;
|
||||
|
||||
if (IsLocalGridUser(ownerID))
|
||||
return m_GridService.MoveItems(ownerID, items);
|
||||
else
|
||||
{
|
||||
UUID sessionID = GetSessionID(ownerID);
|
||||
string uri = GetUserInventoryURI(ownerID) + "/" + ownerID.ToString();
|
||||
return m_HGService.MoveItems(uri, items, sessionID);
|
||||
}
|
||||
}
|
||||
|
||||
public override bool DeleteItems(UUID ownerID, List<UUID> itemIDs)
|
||||
{
|
||||
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Delete {0} items for user {1}", itemIDs.Count, ownerID);
|
||||
|
||||
@@ -289,6 +289,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||
return m_InventoryService.UpdateItem(item);
|
||||
}
|
||||
|
||||
|
||||
public override bool MoveItems(UUID ownerID, List<InventoryItemBase> items)
|
||||
{
|
||||
return m_InventoryService.MoveItems(ownerID, items);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete an item from the user's inventory
|
||||
/// </summary>
|
||||
|
||||
@@ -273,6 +273,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||
return m_RemoteConnector.UpdateItem(item.Owner.ToString(), item, sessionID);
|
||||
}
|
||||
|
||||
public override bool MoveItems(UUID ownerID, List<InventoryItemBase> items)
|
||||
{
|
||||
if (items == null)
|
||||
return false;
|
||||
|
||||
UUID sessionID = GetSessionID(ownerID);
|
||||
return m_RemoteConnector.MoveItems(ownerID.ToString(), items, sessionID);
|
||||
}
|
||||
|
||||
|
||||
public override bool DeleteItems(UUID ownerID, List<UUID> itemIDs)
|
||||
{
|
||||
if (itemIDs == null)
|
||||
|
||||
@@ -638,36 +638,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// <param name="itemID"></param>
|
||||
/// <param name="length"></param>
|
||||
/// <param name="newName"></param>
|
||||
public void MoveInventoryItem(IClientAPI remoteClient, UUID folderID, UUID itemID, int length,
|
||||
string newName)
|
||||
public void MoveInventoryItem(IClientAPI remoteClient, List<InventoryItemBase> items)
|
||||
{
|
||||
m_log.DebugFormat(
|
||||
"[AGENT INVENTORY]: Moving item {0} to {1} for {2}", itemID, folderID, remoteClient.AgentId);
|
||||
"[AGENT INVENTORY]: Moving {0} items for user {1}", items.Count, remoteClient.AgentId);
|
||||
|
||||
InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
|
||||
item = InventoryService.GetItem(item);
|
||||
|
||||
if (item != null)
|
||||
{
|
||||
if (newName != String.Empty)
|
||||
{
|
||||
item.Name = newName;
|
||||
}
|
||||
item.Folder = folderID;
|
||||
|
||||
// Diva comment: can't we just update?
|
||||
List<UUID> uuids = new List<UUID>();
|
||||
uuids.Add(item.ID);
|
||||
InventoryService.DeleteItems(item.Owner, uuids);
|
||||
|
||||
AddInventoryItem(remoteClient, item);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.Warn("[AGENT INVENTORY]: Failed to find item " + itemID.ToString());
|
||||
|
||||
return;
|
||||
}
|
||||
if (!InventoryService.MoveItems(remoteClient.AgentId, items))
|
||||
m_log.Warn("[AGENT INVENTORY]: Failed to move items for user " + remoteClient.AgentId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user