diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index a2e216172d..81b9e1c2c5 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs @@ -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() { 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() { 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() { 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() { 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; } } }