diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 66 |
1 files changed, 47 insertions, 19 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index e40e57d..9446741 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -784,6 +784,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
784 | 784 | ||
785 | private bool CreateInventoryFile() | 785 | private bool CreateInventoryFile() |
786 | { | 786 | { |
787 | // m_log.DebugFormat( | ||
788 | // "[PRIM INVENTORY]: Creating inventory file for {0} {1} {2}, serial {3}", | ||
789 | // m_part.Name, m_part.UUID, m_part.LocalId, m_inventorySerial); | ||
790 | |||
787 | if (m_inventoryFileName == String.Empty || | 791 | if (m_inventoryFileName == String.Empty || |
788 | m_inventoryFileNameSerial < m_inventorySerial) | 792 | m_inventoryFileNameSerial < m_inventorySerial) |
789 | { | 793 | { |
@@ -797,6 +801,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
797 | { | 801 | { |
798 | foreach (TaskInventoryItem item in m_items.Values) | 802 | foreach (TaskInventoryItem item in m_items.Values) |
799 | { | 803 | { |
804 | // m_log.DebugFormat( | ||
805 | // "[PRIM INVENTORY]: Adding item {0} {1} for serial {2} on prim {3} {4} {5}", | ||
806 | // item.Name, item.ItemID, m_inventorySerial, m_part.Name, m_part.UUID, m_part.LocalId); | ||
807 | |||
800 | UUID ownerID = item.OwnerID; | 808 | UUID ownerID = item.OwnerID; |
801 | uint everyoneMask = 0; | 809 | uint everyoneMask = 0; |
802 | uint baseMask = item.BasePermissions; | 810 | uint baseMask = item.BasePermissions; |
@@ -856,28 +864,43 @@ namespace OpenSim.Region.Framework.Scenes | |||
856 | /// <param name="xferManager"></param> | 864 | /// <param name="xferManager"></param> |
857 | public void RequestInventoryFile(IClientAPI client, IXfer xferManager) | 865 | public void RequestInventoryFile(IClientAPI client, IXfer xferManager) |
858 | { | 866 | { |
859 | CreateInventoryFile(); | 867 | lock (m_items) |
860 | |||
861 | if (m_inventorySerial == 0) // No inventory | ||
862 | { | 868 | { |
863 | client.SendTaskInventory(m_part.UUID, 0, new byte[0]); | 869 | // Don't send a inventory xfer name if there are no items. Doing so causes viewer 3 to crash when rezzing |
864 | return; | 870 | // a new script if any previous deletion has left the prim inventory empty. |
865 | } | 871 | if (m_items.Count == 0) // No inventory |
866 | 872 | { | |
867 | // In principle, we should only do the rest if the inventory changed; | 873 | // m_log.DebugFormat( |
868 | // by sending m_inventorySerial to the client, it ought to know | 874 | // "[PRIM INVENTORY]: Not sending inventory data for part {0} {1} {2} for {3} since no items", |
869 | // that nothing changed and that it doesn't need to request the file. | 875 | // m_part.Name, m_part.LocalId, m_part.UUID, client.Name); |
870 | // Unfortunately, it doesn't look like the client optimizes this; | ||
871 | // the client seems to always come back and request the Xfer, | ||
872 | // no matter what value m_inventorySerial has. | ||
873 | 876 | ||
874 | if (m_inventoryFileData.Length > 2) | 877 | client.SendTaskInventory(m_part.UUID, 0, new byte[0]); |
875 | // Add the file for Xfer | 878 | return; |
876 | xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData); | 879 | } |
877 | 880 | ||
878 | // Tell the client we're ready to Xfer the file | 881 | CreateInventoryFile(); |
879 | client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial, | 882 | |
880 | Util.StringToBytes256(m_inventoryFileName)); | 883 | // In principle, we should only do the rest if the inventory changed; |
884 | // by sending m_inventorySerial to the client, it ought to know | ||
885 | // that nothing changed and that it doesn't need to request the file. | ||
886 | // Unfortunately, it doesn't look like the client optimizes this; | ||
887 | // the client seems to always come back and request the Xfer, | ||
888 | // no matter what value m_inventorySerial has. | ||
889 | // FIXME: Could probably be > 0 here rather than > 2 | ||
890 | if (m_inventoryFileData.Length > 2) | ||
891 | { | ||
892 | // Add the file for Xfer | ||
893 | // m_log.DebugFormat( | ||
894 | // "[PRIM INVENTORY]: Adding inventory file {0} (length {1}) for transfer on {2} {3} {4}", | ||
895 | // m_inventoryFileName, m_inventoryFileData.Length, m_part.Name, m_part.UUID, m_part.LocalId); | ||
896 | |||
897 | xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData); | ||
898 | } | ||
899 | |||
900 | // Tell the client we're ready to Xfer the file | ||
901 | client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial, | ||
902 | Util.StringToBytes256(m_inventoryFileName)); | ||
903 | } | ||
881 | } | 904 | } |
882 | 905 | ||
883 | /// <summary> | 906 | /// <summary> |
@@ -1035,10 +1058,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
1035 | item.BasePermissions = perms; | 1058 | item.BasePermissions = perms; |
1036 | } | 1059 | } |
1037 | } | 1060 | } |
1061 | |||
1038 | m_inventorySerial++; | 1062 | m_inventorySerial++; |
1039 | HasInventoryChanged = true; | 1063 | HasInventoryChanged = true; |
1040 | } | 1064 | } |
1041 | 1065 | ||
1066 | /// <summary> | ||
1067 | /// Returns true if this part inventory contains any scripts. False otherwise. | ||
1068 | /// </summary> | ||
1069 | /// <returns></returns> | ||
1042 | public bool ContainsScripts() | 1070 | public bool ContainsScripts() |
1043 | { | 1071 | { |
1044 | lock (m_items) | 1072 | lock (m_items) |