From 42f1b88eb2492f8d218526c1b30ac027a65d67f3 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 15 Sep 2011 18:13:36 +0100 Subject: If a prim inventory becomes empty through deletion, send an empty xfer file name rather than one that references a metadata file containing only the folder object. If we do this, then viewer 3 crashes when we try and rez a script directly in an attachment's prim inventory. Sending an empty file name was already being done if the prim's inventory had never been touched. Now we always do that if there are no items in that inventory. Hopefully addresses the remaining point in http://opensimulator.org/mantis/view.php?id=5644 --- .../Framework/Scenes/SceneObjectPartInventory.cs | 63 +++++++++++++++------- 1 file changed, 43 insertions(+), 20 deletions(-) (limited to 'OpenSim/Region/Framework') diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 57adda7..59ac30d 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -784,6 +784,10 @@ namespace OpenSim.Region.Framework.Scenes private bool CreateInventoryFile() { +// m_log.DebugFormat( +// "[PRIM INVENTORY]: Creating inventory file for {0} {1} {2}, serial {3}", +// m_part.Name, m_part.UUID, m_part.LocalId, m_inventorySerial); + if (m_inventoryFileName == String.Empty || m_inventoryFileNameSerial < m_inventorySerial) { @@ -797,6 +801,10 @@ namespace OpenSim.Region.Framework.Scenes { foreach (TaskInventoryItem item in m_items.Values) { +// m_log.DebugFormat( +// "[PRIM INVENTORY]: Adding item {0} {1} for serial {2} on prim {3} {4} {5}", +// item.Name, item.ItemID, m_inventorySerial, m_part.Name, m_part.UUID, m_part.LocalId); + UUID ownerID = item.OwnerID; uint everyoneMask = 0; uint baseMask = item.BasePermissions; @@ -856,28 +864,43 @@ namespace OpenSim.Region.Framework.Scenes /// public void RequestInventoryFile(IClientAPI client, IXfer xferManager) { - CreateInventoryFile(); - - if (m_inventorySerial == 0) // No inventory + lock (m_items) { - client.SendTaskInventory(m_part.UUID, 0, new byte[0]); - return; - } - - // In principle, we should only do the rest if the inventory changed; - // by sending m_inventorySerial to the client, it ought to know - // that nothing changed and that it doesn't need to request the file. - // Unfortunately, it doesn't look like the client optimizes this; - // the client seems to always come back and request the Xfer, - // no matter what value m_inventorySerial has. + CreateInventoryFile(); - if (m_inventoryFileData.Length > 2) - // Add the file for Xfer - xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData); - - // Tell the client we're ready to Xfer the file - client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial, - Util.StringToBytes256(m_inventoryFileName)); + // Don't send a inventory xfer name if there are no items. Doing so causes viewer 3 to crash when rezzing + // a new script if any previous deletion has left the prim inventory empty. + if (m_items.Count == 0) // No inventory + { +// m_log.DebugFormat( +// "[PRIM INVENTORY]: Not sending inventory data for part {0} {1} {2} for {3} since no items", +// m_part.Name, m_part.LocalId, m_part.UUID, client.Name); + + client.SendTaskInventory(m_part.UUID, 0, new byte[0]); + return; + } + + // In principle, we should only do the rest if the inventory changed; + // by sending m_inventorySerial to the client, it ought to know + // that nothing changed and that it doesn't need to request the file. + // Unfortunately, it doesn't look like the client optimizes this; + // the client seems to always come back and request the Xfer, + // no matter what value m_inventorySerial has. + // FIXME: Could probably be > 0 here rather than > 2 + if (m_inventoryFileData.Length > 2) + { + // Add the file for Xfer + // m_log.DebugFormat( + // "[PRIM INVENTORY]: Adding inventory file {0} (length {1}) for transfer on {2} {3} {4}", + // m_inventoryFileName, m_inventoryFileData.Length, m_part.Name, m_part.UUID, m_part.LocalId); + + xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData); + } + + // Tell the client we're ready to Xfer the file + client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial, + Util.StringToBytes256(m_inventoryFileName)); + } } /// -- cgit v1.1