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
remove-scene-viewer
Justin Clark-Casey (justincc) 2011-09-15 18:13:36 +01:00
parent bd991fc95f
commit 42f1b88eb2
1 changed files with 43 additions and 20 deletions

View File

@ -784,6 +784,10 @@ namespace OpenSim.Region.Framework.Scenes
private bool CreateInventoryFile() 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 || if (m_inventoryFileName == String.Empty ||
m_inventoryFileNameSerial < m_inventorySerial) m_inventoryFileNameSerial < m_inventorySerial)
{ {
@ -797,6 +801,10 @@ namespace OpenSim.Region.Framework.Scenes
{ {
foreach (TaskInventoryItem item in m_items.Values) 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; UUID ownerID = item.OwnerID;
uint everyoneMask = 0; uint everyoneMask = 0;
uint baseMask = item.BasePermissions; uint baseMask = item.BasePermissions;
@ -855,11 +863,19 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
/// <param name="xferManager"></param> /// <param name="xferManager"></param>
public void RequestInventoryFile(IClientAPI client, IXfer xferManager) public void RequestInventoryFile(IClientAPI client, IXfer xferManager)
{
lock (m_items)
{ {
CreateInventoryFile(); CreateInventoryFile();
if (m_inventorySerial == 0) // No inventory // 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]); client.SendTaskInventory(m_part.UUID, 0, new byte[0]);
return; return;
} }
@ -870,15 +886,22 @@ namespace OpenSim.Region.Framework.Scenes
// Unfortunately, it doesn't look like the client optimizes this; // Unfortunately, it doesn't look like the client optimizes this;
// the client seems to always come back and request the Xfer, // the client seems to always come back and request the Xfer,
// no matter what value m_inventorySerial has. // no matter what value m_inventorySerial has.
// FIXME: Could probably be > 0 here rather than > 2
if (m_inventoryFileData.Length > 2) if (m_inventoryFileData.Length > 2)
{
// Add the file for Xfer // 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); xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData);
}
// Tell the client we're ready to Xfer the file // Tell the client we're ready to Xfer the file
client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial, client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial,
Util.StringToBytes256(m_inventoryFileName)); Util.StringToBytes256(m_inventoryFileName));
} }
}
/// <summary> /// <summary>
/// Process inventory backup /// Process inventory backup