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;
@ -856,28 +864,43 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="xferManager"></param> /// <param name="xferManager"></param>
public void RequestInventoryFile(IClientAPI client, IXfer xferManager) public void RequestInventoryFile(IClientAPI client, IXfer xferManager)
{ {
CreateInventoryFile(); lock (m_items)
if (m_inventorySerial == 0) // No inventory
{ {
client.SendTaskInventory(m_part.UUID, 0, new byte[0]); CreateInventoryFile();
return;
// 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));
} }
/// <summary> /// <summary>