mantis 8750: several changes to task inventory accept

This commit is contained in:
UbitUmarov
2020-08-20 20:57:20 +01:00
parent 7bf8d35e3b
commit 0e747f6d4f

View File

@@ -159,244 +159,119 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
UUID agentID = client.AgentId;
if (im.dialog == (byte) InstantMessageDialog.InventoryOffered)
switch((InstantMessageDialog)im.dialog)
{
if (im.binaryBucket.Length < 17) // Invalid
return;
UUID recipientID = new UUID(im.toAgentID);
ScenePresence recipientAgent = scene.GetScenePresence(recipientID);
UUID copyID;
// First byte is the asset type
AssetType assetType = (AssetType)im.binaryBucket[0];
if(assetType == AssetType.LinkFolder || assetType == AssetType.Link)
case InstantMessageDialog.InventoryOffered:
{
client.SendAgentAlertMessage("Can't give a link. Nothing given.", false);
return;
}
if (im.binaryBucket.Length < 17) // Invalid
return;
if (assetType == AssetType.Folder)
{
UUID folderID = new UUID(im.binaryBucket, 1);
if (folderID == UUID.Zero)
UUID recipientID = new UUID(im.toAgentID);
ScenePresence recipientAgent = scene.GetScenePresence(recipientID);
UUID copyID;
// First byte is the asset type
AssetType assetType = (AssetType)im.binaryBucket[0];
if(assetType == AssetType.LinkFolder || assetType == AssetType.Link)
{
client.SendAgentAlertMessage("Can't find folder to give. Nothing given.", false);
client.SendAgentAlertMessage("Can't give a link. Nothing given.", false);
return;
}
m_log.DebugFormat(
"[INVENTORY TRANSFER]: offering folder {0} to agent {1}'s inventory",
folderID, recipientID);
InventoryFolderBase folderCopy = scene.GiveInventoryFolder(client, recipientID, agentID, folderID, UUID.Zero);
if (folderCopy == null)
if (assetType == AssetType.Folder)
{
client.SendAgentAlertMessage("Can't find folder to give. Nothing given.", false);
return;
UUID folderID = new UUID(im.binaryBucket, 1);
if (folderID == UUID.Zero)
{
client.SendAgentAlertMessage("Can't find folder to give. Nothing given.", false);
return;
}
m_log.DebugFormat(
"[INVENTORY TRANSFER]: offering folder {0} to agent {1}'s inventory",
folderID, recipientID);
InventoryFolderBase folderCopy = scene.GiveInventoryFolder(client, recipientID, agentID, folderID, UUID.Zero);
if (folderCopy == null)
{
client.SendAgentAlertMessage("Can't find folder to give. Nothing given.", false);
return;
}
copyID = folderCopy.ID;
copyID.ToBytes(im.binaryBucket,1);
im.imSessionID = copyID.Guid;
if (recipientAgent != null)
{
recipientAgent.ControllingClient.SendBulkUpdateInventory(folderCopy);
}
}
else
{
UUID itemID = new UUID(im.binaryBucket, 1);
if (itemID == UUID.Zero)
{
client.SendAgentAlertMessage("Can't find item to give. Nothing given.", false);
return;
}
m_log.DebugFormat("[INVENTORY TRANSFER]: (giving) Inserting item {0} "+
"into agent {1}'s inventory",
itemID, recipientID);
string message;
InventoryItemBase itemCopy = scene.GiveInventoryItem(recipientID, agentID, itemID, out message);
if (itemCopy == null)
{
client.SendAgentAlertMessage(message, false);
return;
}
copyID = itemCopy.ID;
copyID.ToBytes(im.binaryBucket, 1);
if (recipientAgent != null)
recipientAgent.ControllingClient.SendBulkUpdateInventory(itemCopy);
im.imSessionID = copyID.Guid;
}
copyID = folderCopy.ID;
copyID.ToBytes(im.binaryBucket,1);
im.imSessionID = copyID.Guid;
// Send the IM to the recipient. The item is already
// in their inventory, so it will not be lost if
// they are offline.
if (recipientAgent != null)
{
recipientAgent.ControllingClient.SendBulkUpdateInventory(folderCopy);
}
}
else
{
UUID itemID = new UUID(im.binaryBucket, 1);
if (itemID == UUID.Zero)
{
client.SendAgentAlertMessage("Can't find item to give. Nothing given.", false);
im.offline = 0;
recipientAgent.ControllingClient.SendInstantMessage(im);
return;
}
m_log.DebugFormat("[INVENTORY TRANSFER]: (giving) Inserting item {0} "+
"into agent {1}'s inventory",
itemID, recipientID);
string message;
InventoryItemBase itemCopy = scene.GiveInventoryItem(recipientID, agentID, itemID, out message);
if (itemCopy == null)
else
{
client.SendAgentAlertMessage(message, false);
im.offline = 0;
if (m_TransferModule != null)
{
m_TransferModule.SendInstantMessage(im, delegate(bool success)
{
if (!success)
client.SendAlertMessage("User not online. Inventory has been saved");
});
}
}
break;
}
case InstantMessageDialog.InventoryAccepted:
{
UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip
if(inventoryID == UUID.Zero)
return;
}
copyID = itemCopy.ID;
copyID.ToBytes(im.binaryBucket, 1);
IInventoryService invService = scene.InventoryService;
if (recipientAgent != null)
recipientAgent.ControllingClient.SendBulkUpdateInventory(itemCopy);
im.imSessionID = copyID.Guid;
}
// Send the IM to the recipient. The item is already
// in their inventory, so it will not be lost if
// they are offline.
if (recipientAgent != null)
{
im.offline = 0;
recipientAgent.ControllingClient.SendInstantMessage(im);
return;
}
else
{
im.offline = 0;
if (m_TransferModule != null)
{
m_TransferModule.SendInstantMessage(im, delegate(bool success)
{
if (!success)
client.SendAlertMessage("User not online. Inventory has been saved");
});
}
}
}
else if (im.dialog == (byte) InstantMessageDialog.InventoryAccepted)
{
UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip
if(inventoryID == UUID.Zero)
return;
IInventoryService invService = scene.InventoryService;
ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID));
if (user != null) // Local
{
user.ControllingClient.SendInstantMessage(im);
}
else
{
if (m_TransferModule != null)
m_TransferModule.SendInstantMessage(im, delegate(bool success) {});
}
}
else if (im.dialog == (byte) InstantMessageDialog.TaskInventoryAccepted)
{
if (im.binaryBucket == null || im.binaryBucket.Length < 16)
return;
UUID destinationFolderID = new UUID(im.binaryBucket, 0);
if(destinationFolderID == UUID.Zero) // uuid-zero is a valid folder ID(?) keeping old code assuming not
return;
IInventoryService invService = scene.InventoryService;
InventoryFolderBase destinationFolder = null;
destinationFolder = invService.GetFolder(agentID, destinationFolderID);
if(destinationFolder == null)
return; // no where to put it
UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip
if(inventoryID == UUID.Zero)
return;
InventoryItemBase item = invService.GetItem(agentID, inventoryID);
InventoryFolderBase folder = null;
UUID? previousParentFolderID = null;
if (item != null) // It's an item
{
if(item.Folder != destinationFolderID)
{
item.Folder = destinationFolderID;
invService.MoveItems(item.Owner, new List<InventoryItemBase>() { item });
client.SendInventoryItemCreateUpdate(item, 0);
}
}
else
{
folder = invService.GetFolder(agentID, inventoryID);
if (folder != null) // It's a folder
{
if(folder.ParentID != destinationFolderID)
{
previousParentFolderID = folder.ParentID;
folder.ParentID = destinationFolderID;
invService.MoveFolder(folder);
}
}
}
// Tell client about updates to original parent and new parent (this should probably be factored with existing move item/folder code).
if (previousParentFolderID != null)
{
InventoryFolderBase previousParentFolder = invService.GetFolder(agentID, previousParentFolderID.Value);
if(previousParentFolder != null)
scene.SendInventoryUpdate(client, previousParentFolder, true, true);
scene.SendInventoryUpdate(client, destinationFolder, true, true);
}
}
else if (im.dialog == (byte)InstantMessageDialog.InventoryDeclined ||
im.dialog == (byte)InstantMessageDialog.TaskInventoryDeclined)
{
IInventoryService invService = scene.InventoryService;
InventoryFolderBase trashFolder = invService.GetFolderForType(agentID, FolderType.Trash);
if(trashFolder == null) //??
{
client.SendAgentAlertMessage("Trash folder not found", false);
return;
}
UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip
if(inventoryID == UUID.Zero)
{
client.SendAgentAlertMessage("Item or folder not found", false);
return;
}
InventoryItemBase item = invService.GetItem(agentID, inventoryID);
InventoryFolderBase folder = null;
UUID? previousParentFolderID = null;
if (item != null)
{
if (trashFolder.ID != item.Folder)
{
item.Folder = trashFolder.ID;
invService.MoveItems(item.Owner, new List<InventoryItemBase>() { item });
client.SendInventoryItemCreateUpdate(item, 0);
}
}
else
{
folder = invService.GetFolder(agentID, inventoryID);
if (folder != null)
{
if (trashFolder.ID != folder.ParentID)
{
previousParentFolderID = folder.ParentID;
folder.ParentID = trashFolder.ID;
invService.MoveFolder(folder);
client.SendBulkUpdateInventory(folder);
}
}
}
// Tell client about updates to original parent and new parent (this should probably be factored with existing move item/folder code).
if (previousParentFolderID != null)
{
InventoryFolderBase previousParentFolder = invService.GetFolder(agentID, (UUID)previousParentFolderID);
if(previousParentFolder != null)
scene.SendInventoryUpdate(client, previousParentFolder, true, true);
scene.SendInventoryUpdate(client, trashFolder, true, true);
}
if (im.dialog == (byte)InstantMessageDialog.InventoryDeclined)
{
ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID));
if (user != null) // Local
{
user.ControllingClient.SendInstantMessage(im);
@@ -404,9 +279,146 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
else
{
if (m_TransferModule != null)
m_TransferModule.SendInstantMessage(im, delegate(bool success) { });
m_TransferModule.SendInstantMessage(im, delegate(bool success) {});
}
break;
}
case InstantMessageDialog.TaskInventoryAccepted:
{
if (im.binaryBucket == null || im.binaryBucket.Length < 16)
return;
UUID destinationFolderID = new UUID(im.binaryBucket, 0);
if(destinationFolderID == UUID.Zero) // uuid-zero is a valid folder ID(?) keeping old code assuming not
return;
IInventoryService invService = scene.InventoryService;
InventoryFolderBase destinationFolder = null;
destinationFolder = invService.GetFolder(agentID, destinationFolderID);
if(destinationFolder == null)
return; // no where to put it
UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip
if(inventoryID == UUID.Zero)
return;
InventoryItemBase item = invService.GetItem(agentID, inventoryID);
InventoryFolderBase folder = null;
//UUID? previousParentFolderID = null;
if (item != null) // It's an item
{
if(item.Folder != destinationFolderID)
{
//previousParentFolderID = item.Folder;
item.Folder = destinationFolderID;
invService.MoveItems(item.Owner, new List<InventoryItemBase>() { item });
client.SendInventoryItemCreateUpdate(item, 0);
}
}
else
{
folder = invService.GetFolder(agentID, inventoryID);
if (folder != null) // It's a folder
{
if(folder.ParentID != destinationFolderID)
{
//previousParentFolderID = folder.ParentID;
folder.ParentID = destinationFolderID;
invService.MoveFolder(folder);
client.SendBulkUpdateInventory(folder);
}
}
}
// Tell client about updates to original parent and new parent (this should probably be factored with existing move item/folder code).
//if (previousParentFolderID != null)
{
//InventoryFolderBase previousParentFolder = invService.GetFolder(agentID, previousParentFolderID.Value);
//if(previousParentFolder != null)
//scene.SendInventoryUpdate(client, previousParentFolder, true, true);
//scene.SendInventoryUpdate(client, destinationFolder, true, true);
}
break;
}
case InstantMessageDialog.InventoryDeclined:
case InstantMessageDialog.TaskInventoryDeclined:
{
IInventoryService invService = scene.InventoryService;
InventoryFolderBase trashFolder = invService.GetFolderForType(agentID, FolderType.Trash);
if(trashFolder == null) //??
{
client.SendAgentAlertMessage("Trash folder not found", false);
return;
}
UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip
if(inventoryID == UUID.Zero)
{
client.SendAgentAlertMessage("Item or folder not found", false);
return;
}
InventoryItemBase item = invService.GetItem(agentID, inventoryID);
InventoryFolderBase folder = null;
//UUID? previousParentFolderID = null;
if (item != null)
{
if (trashFolder.ID != item.Folder)
{
//previousParentFolderID = item.Folder;
item.Folder = trashFolder.ID;
invService.MoveItems(item.Owner, new List<InventoryItemBase>() { item });
client.SendInventoryItemCreateUpdate(item, 0);
}
}
else
{
folder = invService.GetFolder(agentID, inventoryID);
if (folder != null)
{
if (trashFolder.ID != folder.ParentID)
{
//previousParentFolderID = folder.ParentID;
folder.ParentID = trashFolder.ID;
invService.MoveFolder(folder);
client.SendBulkUpdateInventory(folder);
}
}
}
// Tell client about updates to original parent and new parent (this should probably be factored with existing move item/folder code).
//if (previousParentFolderID != null)
{
//InventoryFolderBase previousParentFolder = invService.GetFolder(agentID, (UUID)previousParentFolderID);
//if(previousParentFolder != null)
//scene.SendInventoryUpdate(client, previousParentFolder, true, true);
//scene.SendInventoryUpdate(client, trashFolder, true, true);
}
if (im.dialog == (byte)InstantMessageDialog.InventoryDeclined)
{
ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID));
if (user != null) // Local
{
user.ControllingClient.SendInstantMessage(im);
}
else
{
if (m_TransferModule != null)
m_TransferModule.SendInstantMessage(im, delegate(bool success) { });
}
}
break;
}
default:
break;
}
}
@@ -429,89 +441,93 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
if (user == null)
return;
switch((InstantMessageDialog)im.dialog)
{
// This requires a little bit of processing because we have to make the
// new item visible in the recipient's inventory here
//
if (im.dialog == (byte) InstantMessageDialog.InventoryOffered)
{
if (im.binaryBucket.Length < 17) // Invalid
return;
UUID recipientID = new UUID(im.toAgentID);
// First byte is the asset type
AssetType assetType = (AssetType)im.binaryBucket[0];
if (AssetType.Folder == assetType)
case InstantMessageDialog.InventoryOffered:
{
UUID folderID = new UUID(im.binaryBucket, 1);
if (im.binaryBucket.Length < 17) // Invalid
return;
InventoryFolderBase folder =
scene.InventoryService.GetFolder(recipientID, folderID);
UUID recipientID = new UUID(im.toAgentID);
if (folder != null)
user.ControllingClient.SendBulkUpdateInventory(folder);
}
else
{
UUID itemID = new UUID(im.binaryBucket, 1);
// First byte is the asset type
AssetType assetType = (AssetType)im.binaryBucket[0];
InventoryItemBase item =
scene.InventoryService.GetItem(recipientID, itemID);
if (item != null)
if (AssetType.Folder == assetType)
{
user.ControllingClient.SendBulkUpdateInventory(item);
UUID folderID = new UUID(im.binaryBucket, 1);
InventoryFolderBase folder =
scene.InventoryService.GetFolder(recipientID, folderID);
if (folder != null)
user.ControllingClient.SendBulkUpdateInventory(folder);
}
}
user.ControllingClient.SendInstantMessage(im);
}
if (im.dialog == (byte) InstantMessageDialog.TaskInventoryOffered)
{
if (im.binaryBucket.Length < 1) // Invalid
return;
UUID recipientID = new UUID(im.toAgentID);
// Bucket is the asset type
AssetType assetType = (AssetType)im.binaryBucket[0];
if (AssetType.Folder == assetType)
{
UUID folderID = new UUID(im.imSessionID);
InventoryFolderBase folder =
scene.InventoryService.GetFolder(recipientID, folderID);
if (folder != null)
user.ControllingClient.SendBulkUpdateInventory(folder);
}
else
{
UUID itemID = new UUID(im.imSessionID);
InventoryItemBase item =
scene.InventoryService.GetItem(recipientID, itemID);
if (item != null)
else
{
user.ControllingClient.SendBulkUpdateInventory(item);
UUID itemID = new UUID(im.binaryBucket, 1);
InventoryItemBase item =
scene.InventoryService.GetItem(recipientID, itemID);
if (item != null)
{
user.ControllingClient.SendBulkUpdateInventory(item);
}
}
user.ControllingClient.SendInstantMessage(im);
break;
}
case InstantMessageDialog.TaskInventoryOffered:
{
if (im.binaryBucket.Length < 1) // Invalid
return;
// Fix up binary bucket since this may be 17 chars long here
Byte[] bucket = new Byte[1];
bucket[0] = im.binaryBucket[0];
im.binaryBucket = bucket;
UUID recipientID = new UUID(im.toAgentID);
user.ControllingClient.SendInstantMessage(im);
}
else if (im.dialog == (byte) InstantMessageDialog.InventoryAccepted ||
im.dialog == (byte) InstantMessageDialog.InventoryDeclined ||
im.dialog == (byte) InstantMessageDialog.TaskInventoryDeclined ||
im.dialog == (byte) InstantMessageDialog.TaskInventoryAccepted)
{
user.ControllingClient.SendInstantMessage(im);
// Bucket is the asset type
AssetType assetType = (AssetType)im.binaryBucket[0];
if (AssetType.Folder == assetType)
{
UUID folderID = new UUID(im.imSessionID);
InventoryFolderBase folder = scene.InventoryService.GetFolder(recipientID, folderID);
if (folder != null)
user.ControllingClient.SendBulkUpdateInventory(folder);
}
else
{
UUID itemID = new UUID(im.imSessionID);
InventoryItemBase item = scene.InventoryService.GetItem(recipientID, itemID);
if (item != null)
{
user.ControllingClient.SendBulkUpdateInventory(item);
}
}
// Fix up binary bucket since this may be 17 chars long here
Byte[] bucket = new Byte[1];
bucket[0] = im.binaryBucket[0];
im.binaryBucket = bucket;
user.ControllingClient.SendInstantMessage(im);
break;
}
case InstantMessageDialog.InventoryAccepted:
case InstantMessageDialog.InventoryDeclined:
case InstantMessageDialog.TaskInventoryDeclined:
case InstantMessageDialog.TaskInventoryAccepted:
{
user.ControllingClient.SendInstantMessage(im);
break;
}
default:
break;
}
}
}