diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index a3177f70e3..68a059157f 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -310,8 +310,9 @@ namespace OpenSim.Framework public delegate void RequestTaskInventory(IClientAPI remoteClient, uint localID); - public delegate void UpdateInventoryItemTransaction( - IClientAPI remoteClient, LLUUID transactionID, LLUUID assetID, LLUUID itemID); + public delegate void UpdateInventoryItem( + IClientAPI remoteClient, LLUUID transactionID, LLUUID itemID, string name, string description, + uint nextOwnerMask); public delegate void CopyInventoryItem( IClientAPI remoteClient, uint callbackID, LLUUID oldAgentID, LLUUID oldItemID, LLUUID newFolderID, string newName); @@ -392,7 +393,7 @@ namespace OpenSim.Framework event FetchInventoryDescendents OnFetchInventoryDescendents; event FetchInventory OnFetchInventory; event RequestTaskInventory OnRequestTaskInventory; - event UpdateInventoryItemTransaction OnUpdateInventoryItem; + event UpdateInventoryItem OnUpdateInventoryItem; event CopyInventoryItem OnCopyInventoryItem; event UDPAssetUploadRequest OnAssetUploadRequest; event XferReceive OnXferReceive; @@ -417,6 +418,8 @@ namespace OpenSim.Framework LLUUID AgentId { get; } LLUUID SessionId { get; } + + LLUUID SecureSessionId { get; } string FirstName { get; } @@ -481,7 +484,7 @@ namespace OpenSim.Framework /// /// Tell the client that we have created the item it requested. /// - /// + /// void SendInventoryItemCreateUpdate(InventoryItemBase Item); void SendRemoveInventoryItem(LLUUID itemID); diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs index f04a70a20b..1c16a95c7c 100644 --- a/OpenSim/Region/ClientStack/ClientView.cs +++ b/OpenSim/Region/ClientStack/ClientView.cs @@ -59,7 +59,14 @@ namespace OpenSim.Region.ClientStack //local handlers for this instance private LLUUID m_sessionId; - public LLUUID SecureSessionID = LLUUID.Zero; + + private LLUUID m_secureSessionId = LLUUID.Zero; + + public LLUUID SecureSessionId + { + get { return m_secureSessionId; } + } + public string firstName; public string lastName; private UseCircuitCodePacket cirpack; @@ -540,7 +547,7 @@ namespace OpenSim.Region.ClientStack if (sessionInfo.LoginInfo.SecureSession != LLUUID.Zero) { - SecureSessionID = sessionInfo.LoginInfo.SecureSession; + m_secureSessionId = sessionInfo.LoginInfo.SecureSession; } InitNewClient(); @@ -615,7 +622,7 @@ namespace OpenSim.Region.ClientStack public event FetchInventoryDescendents OnFetchInventoryDescendents; public event FetchInventory OnFetchInventory; public event RequestTaskInventory OnRequestTaskInventory; - public event UpdateInventoryItemTransaction OnUpdateInventoryItem; + public event UpdateInventoryItem OnUpdateInventoryItem; public event CopyInventoryItem OnCopyInventoryItem; public event UDPAssetUploadRequest OnAssetUploadRequest; public event XferReceive OnXferReceive; @@ -888,7 +895,7 @@ namespace OpenSim.Region.ClientStack AgentCircuitData agentData = new AgentCircuitData(); agentData.AgentID = AgentId; agentData.SessionID = m_sessionId; - agentData.SecureSessionID = SecureSessionID; + agentData.SecureSessionID = SecureSessionId; agentData.circuitcode = m_circuitCode; agentData.child = false; agentData.firstname = firstName; @@ -2953,10 +2960,10 @@ namespace OpenSim.Region.ClientStack case PacketType.AssetUploadRequest: AssetUploadRequestPacket request = (AssetUploadRequestPacket) Pack; // Console.WriteLine("upload request " + Pack.ToString()); - // Console.WriteLine("upload request was for assetid: " + request.AssetBlock.TransactionID.Combine(this.SecureSessionID).ToStringHyphenated()); + // Console.WriteLine("upload request was for assetid: " + request.AssetBlock.TransactionID.Combine(this.SecureSessionId).ToStringHyphenated()); if (OnAssetUploadRequest != null) { - OnAssetUploadRequest(this, request.AssetBlock.TransactionID.Combine(SecureSessionID), + OnAssetUploadRequest(this, request.AssetBlock.TransactionID.Combine(SecureSessionId), request.AssetBlock.TransactionID, request.AssetBlock.Type, request.AssetBlock.AssetData, request.AssetBlock.StoreLocal); } @@ -3033,12 +3040,11 @@ namespace OpenSim.Region.ClientStack { for (int i = 0; i < update.InventoryData.Length; i++) { - if (update.InventoryData[i].TransactionID != LLUUID.Zero) - { - OnUpdateInventoryItem(this, update.InventoryData[i].TransactionID, - update.InventoryData[i].TransactionID.Combine(SecureSessionID), - update.InventoryData[i].ItemID); - } + OnUpdateInventoryItem(this, update.InventoryData[i].TransactionID, + update.InventoryData[i].ItemID, + Util.FieldToString(update.InventoryData[i].Name), + Util.FieldToString(update.InventoryData[i].Description), + update.InventoryData[i].NextOwnerMask); } } //Console.WriteLine(Pack.ToString()); @@ -3046,7 +3052,7 @@ namespace OpenSim.Region.ClientStack { if (update.InventoryData[i].TransactionID != LLUUID.Zero) { - AssetBase asset = m_assetCache.GetAsset(update.InventoryData[i].TransactionID.Combine(this.SecureSessionID)); + AssetBase asset = m_assetCache.GetAsset(update.InventoryData[i].TransactionID.Combine(this.SecureSessionId)); if (asset != null) { // Console.WriteLine("updating inventory item, found asset" + asset.FullID.ToStringHyphenated() + " already in cache"); diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 1ea8d5a136..5976fdc314 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -106,52 +106,107 @@ namespace OpenSim.Region.Environment.Scenes return LLUUID.Zero; } - public void UDPUpdateInventoryItemAsset(IClientAPI remoteClient, LLUUID transactionID, LLUUID assetID, - LLUUID itemID) - { - CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); - if (userInfo != null) + /// + /// Update an item which is either already in the client's inventory or is within + /// a transaction + /// + /// + /// The transaction ID. If this is LLUUID.Zero we will + /// assume that we are not in a transaction + /// The ID of the updated item + /// The name of the updated item + /// The description of the updated item + /// The permissions of the updated item + public void UpdateInventoryItemAsset(IClientAPI remoteClient, LLUUID transactionID, + LLUUID itemID, string name, string description, + uint nextOwnerMask) + { + CachedUserInfo userInfo + = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); + + if (userInfo != null && userInfo.RootFolder != null) { - if (userInfo.RootFolder != null) + InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); + if (item != null) { - InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); - if (item != null) + AssetBase asset = null; + bool addAsset = false; + + // If we're not inside a transaction and an existing asset is attached + // to the update item, then we need to create a new asset for the new details + if (LLUUID.Zero == transactionID) { - AgentAssetTransactions transactions = - CommsManager.TransactionsManager.GetUserTransActions(remoteClient.AgentId); + asset = AssetCache.GetAsset(item.assetID); + + if (asset != null) + { + // to update an item we need to create a new asset + // it's possible that this could be optimized to an update if we knew + // that the owner's inventory had the only copy of the item (I believe + // we're using copy on write semantics). + item.inventoryName = asset.Name = name; + item.inventoryDescription = asset.Description = description; + item.inventoryNextPermissions = nextOwnerMask; + item.assetID = asset.FullID = LLUUID.Random(); + + addAsset = true; + } + else + { + OpenSim.Framework.Console.MainLog.Instance.Warn( + "Asset ID " + item.assetID + " not found for item ID " + itemID + + " named " + item.inventoryName + " for an inventory item update."); + return; + } + } + else + { + AgentAssetTransactions transactions + = CommsManager.TransactionsManager.GetUserTransActions(remoteClient.AgentId); + if (transactions != null) { - AssetBase asset = null; - bool addToCache = false; - + LLUUID assetID = transactionID.Combine(remoteClient.SecureSessionId); asset = AssetCache.GetAsset(assetID); + if (asset == null) { asset = transactions.GetTransactionAsset(transactionID); - addToCache = true; } - - if (asset != null) + + if (asset != null && asset.FullID == assetID) { - if (asset.FullID == assetID) - { - asset.Name = item.inventoryName; - asset.Description = item.inventoryDescription; - asset.InvType = (sbyte) item.invType; - asset.Type = (sbyte) item.assetType; - item.assetID = asset.FullID; - - if (addToCache) - { - AssetCache.AddAsset(asset); - } - - userInfo.UpdateItem(remoteClient.AgentId, item); - } + asset.Name = item.inventoryName; + asset.Description = item.inventoryDescription; + asset.InvType = (sbyte) item.invType; + asset.Type = (sbyte) item.assetType; + item.assetID = asset.FullID; + + addAsset = true; } } } + + if (asset != null) + { + if (addAsset) + { + AssetCache.AddAsset(asset); + } + + userInfo.UpdateItem(remoteClient.AgentId, item); + } } + else + { + OpenSim.Framework.Console.MainLog.Instance.Warn( + "Item ID " + itemID + " not found for an inventory item update."); + } + } + else + { + OpenSim.Framework.Console.MainLog.Instance.Warn( + "Agent ID " + remoteClient.AgentId + " not found for an inventory item update."); } } @@ -507,4 +562,4 @@ namespace OpenSim.Region.Environment.Scenes rootPart.ScheduleFullUpdate(); } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 09ecae07a7..8fc04c4f33 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -989,7 +989,7 @@ namespace OpenSim.Region.Environment.Scenes client.OnFetchInventoryDescendents += CommsManager.UserProfileCacheService.HandleFecthInventoryDescendents; client.OnRequestTaskInventory += RequestTaskInventory; client.OnFetchInventory += CommsManager.UserProfileCacheService.HandleFetchInventory; - client.OnUpdateInventoryItem += UDPUpdateInventoryItemAsset; + client.OnUpdateInventoryItem += UpdateInventoryItemAsset; client.OnCopyInventoryItem += CopyInventoryItem; client.OnAssetUploadRequest += CommsManager.TransactionsManager.HandleUDPUploadRequest; client.OnXferReceive += CommsManager.TransactionsManager.HandleXfer; diff --git a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs index 6887debaed..69cf7b32bc 100644 --- a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs @@ -108,7 +108,7 @@ namespace SimpleApp public event FetchInventoryDescendents OnFetchInventoryDescendents; public event FetchInventory OnFetchInventory; public event RequestTaskInventory OnRequestTaskInventory; - public event UpdateInventoryItemTransaction OnUpdateInventoryItem; + public event UpdateInventoryItem OnUpdateInventoryItem; public event CopyInventoryItem OnCopyInventoryItem; public event UDPAssetUploadRequest OnAssetUploadRequest; public event XferReceive OnXferReceive; @@ -157,6 +157,11 @@ namespace SimpleApp { get { return LLUUID.Zero; } } + + public LLUUID SecureSessionId + { + get { return LLUUID.Zero; } + } public virtual string FirstName {