diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs index b72add27d3..a7b0e73ac6 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs @@ -4603,6 +4603,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //UpdateSOPProperty(part, m_propertiesSyncInfo[property]); SetSOPPropertyValue(part, property); propertiesUpdated.Add(property); + + if (property == SceneObjectPartSyncProperties.TaskInventory) + { + //Mark the inventory as has changed, for proper backup + part.Inventory.ForceInventoryPersistence(); + } + + part.ParentGroup.HasGroupChanged = true; } } catch (Exception e) diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index d34a8a8f5a..17350df79f 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs @@ -233,5 +233,8 @@ namespace OpenSim.Region.Framework.Interfaces /// A /// Dictionary GetScriptStates(); + + //DSG + bool UpdateInventoryItemBySync(TaskInventoryItem item); } } diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 6c7a359934..f22c893110 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -327,7 +327,7 @@ namespace OpenSim.Region.Framework.Scenes //Scene does permission checking, asset creation and storing, then informs Script Engine to //update the script. //////////////////////////////////////////////////////////////////////////////////////////////// - //Only should be called when this is the cached Scene of script engine + //Only should be called when this is the local Scene of script engine public ArrayList OnUpdateScript(UUID avatarID, UUID itemID, UUID primID, bool isScriptRunning, UUID newAssetID) { ArrayList errors = new ArrayList(); @@ -353,7 +353,7 @@ namespace OpenSim.Region.Framework.Scenes // Update item with new asset item.AssetID = newAssetID; - group.UpdateInventoryItem(item); + group.UpdateInventoryItemBySync(item); m_log.Debug("UpdateInventoryItem on object "+group.UUID); if (isScriptRunning) @@ -419,9 +419,14 @@ namespace OpenSim.Region.Framework.Scenes return new ArrayList(); } - // Update item with new asset + // Update item with new asset. + // The actor that initiate the UpdateScript event should also send out + // a sync message for the updated task inventory. In case that sync message is + // not here year, we retrieve and update the task item -- w/o marking that + // the taskinventory is modified here, so that when the sync message is here, + // the actor and timestamp info will be copied. item.AssetID = newAssetID; - group.UpdateInventoryItem(item); + group.UpdateInventoryItemBySync(item); m_log.Debug("UpdateInventoryItem on object "+group.UUID); if (isScriptRunning) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs index 61fde6f0e9..be480f0172 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs @@ -398,5 +398,33 @@ namespace OpenSim.Region.Framework.Scenes parts[i].Inventory.SuspendScripts(); } #endregion REGION SYNC + + #region DSG SYNC + /// + /// Update an existing inventory item. + /// + /// The updated item. An item with the same id must already exist + /// in this prim's inventory + /// false if the item did not exist, true if the update occurred succesfully + public bool UpdateInventoryItemBySync(TaskInventoryItem item) + { + SceneObjectPart part = GetChildPart(item.ParentPartID); + if (part != null) + { + part.Inventory.UpdateInventoryItemBySync(item); + + return true; + } + else + { + m_log.ErrorFormat( + "[PRIM INVENTORY]: " + + "Couldn't find prim ID {0} to update item {1}, {2}", + item.ParentPartID, item.Name, item.ItemID); + } + + return false; + } + #endregion } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 1ce7076e07..21a670fe7d 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -727,6 +727,9 @@ namespace OpenSim.Region.Framework.Scenes { HasInventoryChanged = true; m_part.ParentGroup.HasGroupChanged = true; + + //DSG + m_part.ScheduleSyncUpdate(new List(){SceneObjectPartSyncProperties.TaskInventory}); } return true; @@ -1182,6 +1185,68 @@ namespace OpenSim.Region.Framework.Scenes } } #endregion REGION SYNC + + #region DSG SYNC + /// + /// Update an existing inventory item. + /// + /// The updated item. An item with the same id must already exist + /// in this prim's inventory. + /// false if the item did not exist, true if the update occurred successfully + public bool UpdateInventoryItemBySync(TaskInventoryItem item) + { + return UpdateInventoryItemBySync(item, true, true); + } + + //Similar to UpdateInventoryItem except that ScheduleSyncUpdate is not triggered + private bool UpdateInventoryItemBySync(TaskInventoryItem item, bool fireScriptEvents, bool considerChanged) + { + TaskInventoryItem it = GetInventoryItem(item.ItemID); + if (it != null) + { +// m_log.DebugFormat("[PRIM INVENTORY]: Updating item {0} in {1}", item.Name, m_part.Name); + + item.ParentID = m_part.UUID; + item.ParentPartID = m_part.UUID; + + // If group permissions have been set on, check that the groupID is up to date in case it has + // changed since permissions were last set. + if (item.GroupPermissions != (uint)PermissionMask.None) + item.GroupID = m_part.GroupID; + + if (item.AssetID == UUID.Zero) + item.AssetID = it.AssetID; + + lock (m_items) + { + m_items[item.ItemID] = item; + m_inventorySerial++; + } + + if (fireScriptEvents) + m_part.TriggerScriptChangedEvent(Changed.INVENTORY); + + if (considerChanged) + { + HasInventoryChanged = true; + m_part.ParentGroup.HasGroupChanged = true; + } + + return true; + } + else + { + m_log.ErrorFormat( + "[PRIM INVENTORY]: " + + "Tried to retrieve item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory", + item.ItemID, m_part.Name, m_part.UUID, + m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); + } + return false; + + } + + #endregion DSG SYNC } /*