Переглянути джерело

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
Justin Clark-Casey (justincc) 13 роки тому
батько
коміт
42f1b88eb2

+ 43 - 20
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
         /// <param name="xferManager"></param>
         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));
+            }
         }
 
         /// <summary>