diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 57adda7be4..59ac30da69 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;
+ CreateInventoryFile();
+
+ // 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));
}
-
- // 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.
-
- 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));
}
///