diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index d36d74bf1e..a2e216172d 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs @@ -154,34 +154,42 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer // im.fromAgentID, im.fromAgentName, im.toAgentID); Scene scene = FindClientScene(client.AgentId); - if (scene == null) // Something seriously wrong here. return; + UUID agentID = client.AgentId; + if (im.dialog == (byte) InstantMessageDialog.InventoryOffered) { - //m_log.DebugFormat("Asset type {0}", ((AssetType)im.binaryBucket[0])); - if (im.binaryBucket.Length < 17) // Invalid return; UUID recipientID = new UUID(im.toAgentID); - ScenePresence user = scene.GetScenePresence(recipientID); + 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 give a link. Nothing given.", false); + return; + } - if (AssetType.Folder == assetType) + if (assetType == AssetType.Folder) { 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]: Inserting original folder {0} into agent {1}'s inventory", - folderID, new UUID(im.toAgentID)); + "[INVENTORY TRANSFER]: offering folder {0} to agent {1}'s inventory", + folderID, recipientID); - InventoryFolderBase folderCopy - = scene.GiveInventoryFolder(client, recipientID, client.AgentId, folderID, UUID.Zero); + InventoryFolderBase folderCopy = scene.GiveInventoryFolder(client, recipientID, agentID, folderID, UUID.Zero); if (folderCopy == null) { @@ -189,36 +197,30 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer return; } - // The outgoing binary bucket should contain only the byte which signals an asset folder is - // being copied and the following bytes for the copied folder's UUID copyID = folderCopy.ID; - byte[] copyIDBytes = copyID.GetBytes(); - im.binaryBucket = new byte[1 + copyIDBytes.Length]; - im.binaryBucket[0] = (byte)AssetType.Folder; - Array.Copy(copyIDBytes, 0, im.binaryBucket, 1, copyIDBytes.Length); - - if (user != null) - user.ControllingClient.SendBulkUpdateInventory(folderCopy); - - // HACK!! - // Insert the ID of the copied folder into the IM so that we know which item to move to trash if it - // is rejected. - // XXX: This is probably a misuse of the session ID slot. + copyID.ToBytes(im.binaryBucket,1); im.imSessionID = copyID.Guid; + + if (recipientAgent != null) + { + recipientAgent.ControllingClient.SendBulkUpdateInventory(folderCopy); + } } else { - // First byte of the array is probably the item type - // Next 16 bytes are the UUID - 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, new UUID(im.toAgentID)); + itemID, recipientID); string message; - InventoryItemBase itemCopy = scene.GiveInventoryItem(new UUID(im.toAgentID), client.AgentId, itemID, out message); + InventoryItemBase itemCopy = scene.GiveInventoryItem(recipientID, agentID, itemID, out message); if (itemCopy == null) { @@ -227,74 +229,46 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer } copyID = itemCopy.ID; - Array.Copy(copyID.GetBytes(), 0, im.binaryBucket, 1, 16); + copyID.ToBytes(im.binaryBucket, 1); - if (user != null) - user.ControllingClient.SendBulkUpdateInventory(itemCopy); + if (recipientAgent != null) + recipientAgent.ControllingClient.SendBulkUpdateInventory(itemCopy); - // HACK!! - // Insert the ID of the copied item into the IM so that we know which item to move to trash if it - // is rejected. - // XXX: This is probably a misuse of the session ID slot. im.imSessionID = copyID.Guid; } - im.offline = 0; - // Send the IM to the recipient. The item is already // in their inventory, so it will not be lost if // they are offline. - // - if (user != null) + + if (recipientAgent != null) { - user.ControllingClient.SendInstantMessage(im); + 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; - // Special case: folder redirect. - // RLV uses this - if (im.dialog == (byte) InstantMessageDialog.TaskInventoryAccepted) - { - InventoryFolderBase folder = invService.GetFolder(client.AgentId, inventoryID); - - if (folder != null) - { - if (im.binaryBucket.Length >= 16) - { - UUID destFolderID = new UUID(im.binaryBucket, 0); - if (destFolderID != UUID.Zero) - { - InventoryFolderBase destFolder = invService.GetFolder(client.AgentId, destFolderID); - if (destFolder != null) - { - if (folder.ParentID != destFolder.ID) - { - folder.ParentID = destFolder.ID; - invService.MoveFolder(folder); - client.SendBulkUpdateInventory(folder); - } - } - } - } - } - } - ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID)); - if (user != null) // Local { user.ControllingClient.SendInstantMessage(im); @@ -307,121 +281,114 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer } else if (im.dialog == (byte) InstantMessageDialog.TaskInventoryAccepted) { - UUID destinationFolderID = UUID.Zero; + if (im.binaryBucket == null || im.binaryBucket.Length < 16) + return; - if (im.binaryBucket != null && im.binaryBucket.Length >= 16) - destinationFolderID = new UUID(im.binaryBucket, 0); + 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; - if (destinationFolderID != UUID.Zero) - destinationFolder = invService.GetFolder(client.AgentId, destinationFolderID); + destinationFolder = invService.GetFolder(agentID, destinationFolderID); - if(destinationFolder != null) - { - UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip - - InventoryItemBase item = invService.GetItem(client.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(client.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(client.AgentId, (UUID)previousParentFolderID); - scene.SendInventoryUpdate(client, previousParentFolder, true, true); - - scene.SendInventoryUpdate(client, destinationFolder, true, true); - } - } - } - else if ( - im.dialog == (byte)InstantMessageDialog.InventoryDeclined - || im.dialog == (byte)InstantMessageDialog.TaskInventoryDeclined) - { - // Here, the recipient is local and we can assume that the - // inventory is loaded. Courtesy of the above bulk update, - // It will have been pushed to the client, too - // - IInventoryService invService = scene.InventoryService; - - InventoryFolderBase trashFolder = - invService.GetFolderForType(client.AgentId, FolderType.Trash); + 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(client.AgentId, inventoryID); + InventoryItemBase item = invService.GetItem(agentID, inventoryID); InventoryFolderBase folder = null; UUID? previousParentFolderID = null; - if (item != null && trashFolder != null) + if (item != null) // It's an item { - previousParentFolderID = item.Folder; - item.Folder = trashFolder.ID; - - // Diva comment: can't we just update this item??? - List uuids = new List(); - uuids.Add(item.ID); - invService.DeleteItems(item.Owner, uuids); - scene.AddInventoryItem(client, item); + if(item.Folder != destinationFolderID) + { + item.Folder = destinationFolderID; + invService.MoveItems(item.Owner, new List() { item }); + client.SendInventoryItemCreateUpdate(item, 0); + } } else { - folder = invService.GetFolder(client.AgentId, inventoryID); + folder = invService.GetFolder(agentID, inventoryID); - if (folder != null && trashFolder != null) + if (folder != null) // It's a folder { - previousParentFolderID = folder.ParentID; - folder.ParentID = trashFolder.ID; - invService.MoveFolder(folder); - client.SendBulkUpdateInventory(folder); + if(folder.ParentID != destinationFolderID) + { + previousParentFolderID = folder.ParentID; + folder.ParentID = destinationFolderID; + invService.MoveFolder(folder); + } } } - if ((null == item && null == folder) || null == trashFolder) - { - string reason = String.Empty; - - if (trashFolder == null) - reason += " Trash folder not found."; - if (item == null) - reason += " Item not found."; - if (folder == null) - reason += " Folder not found."; - - client.SendAgentAlertMessage("Unable to delete "+ - "received inventory" + reason, false); - } // Tell client about updates to original parent and new parent (this should probably be factored with existing move item/folder code). - else if (previousParentFolderID != null) + if (previousParentFolderID != null) { - InventoryFolderBase previousParentFolder = invService.GetFolder(client.AgentId, (UUID)previousParentFolderID); - scene.SendInventoryUpdate(client, previousParentFolder, true, true); + 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); }