diff options
Diffstat (limited to 'OpenSim/Region/Environment/Scenes/Scene.Inventory.cs')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.Inventory.cs | 119 |
1 files changed, 87 insertions, 32 deletions
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 1ea8d5a..5976fdc 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs | |||
@@ -106,53 +106,108 @@ namespace OpenSim.Region.Environment.Scenes | |||
106 | return LLUUID.Zero; | 106 | return LLUUID.Zero; |
107 | } | 107 | } |
108 | 108 | ||
109 | public void UDPUpdateInventoryItemAsset(IClientAPI remoteClient, LLUUID transactionID, LLUUID assetID, | 109 | /// <summary> |
110 | LLUUID itemID) | 110 | /// Update an item which is either already in the client's inventory or is within |
111 | { | 111 | /// a transaction |
112 | CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | 112 | /// </summary> |
113 | if (userInfo != null) | 113 | /// <param name="remoteClient"></param> |
114 | /// <param name="transactionID">The transaction ID. If this is LLUUID.Zero we will | ||
115 | /// assume that we are not in a transaction</param> | ||
116 | /// <param name="itemID">The ID of the updated item</param> | ||
117 | /// <param name="name">The name of the updated item</param> | ||
118 | /// <param name="description">The description of the updated item</param> | ||
119 | /// <param name="nextOwnerMask">The permissions of the updated item</param> | ||
120 | public void UpdateInventoryItemAsset(IClientAPI remoteClient, LLUUID transactionID, | ||
121 | LLUUID itemID, string name, string description, | ||
122 | uint nextOwnerMask) | ||
123 | { | ||
124 | CachedUserInfo userInfo | ||
125 | = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | ||
126 | |||
127 | if (userInfo != null && userInfo.RootFolder != null) | ||
114 | { | 128 | { |
115 | if (userInfo.RootFolder != null) | 129 | InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); |
130 | if (item != null) | ||
116 | { | 131 | { |
117 | InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); | 132 | AssetBase asset = null; |
118 | if (item != null) | 133 | bool addAsset = false; |
134 | |||
135 | // If we're not inside a transaction and an existing asset is attached | ||
136 | // to the update item, then we need to create a new asset for the new details | ||
137 | if (LLUUID.Zero == transactionID) | ||
138 | { | ||
139 | asset = AssetCache.GetAsset(item.assetID); | ||
140 | |||
141 | if (asset != null) | ||
142 | { | ||
143 | // to update an item we need to create a new asset | ||
144 | // it's possible that this could be optimized to an update if we knew | ||
145 | // that the owner's inventory had the only copy of the item (I believe | ||
146 | // we're using copy on write semantics). | ||
147 | item.inventoryName = asset.Name = name; | ||
148 | item.inventoryDescription = asset.Description = description; | ||
149 | item.inventoryNextPermissions = nextOwnerMask; | ||
150 | item.assetID = asset.FullID = LLUUID.Random(); | ||
151 | |||
152 | addAsset = true; | ||
153 | } | ||
154 | else | ||
155 | { | ||
156 | OpenSim.Framework.Console.MainLog.Instance.Warn( | ||
157 | "Asset ID " + item.assetID + " not found for item ID " + itemID | ||
158 | + " named " + item.inventoryName + " for an inventory item update."); | ||
159 | return; | ||
160 | } | ||
161 | } | ||
162 | else | ||
119 | { | 163 | { |
120 | AgentAssetTransactions transactions = | 164 | AgentAssetTransactions transactions |
121 | CommsManager.TransactionsManager.GetUserTransActions(remoteClient.AgentId); | 165 | = CommsManager.TransactionsManager.GetUserTransActions(remoteClient.AgentId); |
166 | |||
122 | if (transactions != null) | 167 | if (transactions != null) |
123 | { | 168 | { |
124 | AssetBase asset = null; | 169 | LLUUID assetID = transactionID.Combine(remoteClient.SecureSessionId); |
125 | bool addToCache = false; | ||
126 | |||
127 | asset = AssetCache.GetAsset(assetID); | 170 | asset = AssetCache.GetAsset(assetID); |
171 | |||
128 | if (asset == null) | 172 | if (asset == null) |
129 | { | 173 | { |
130 | asset = transactions.GetTransactionAsset(transactionID); | 174 | asset = transactions.GetTransactionAsset(transactionID); |
131 | addToCache = true; | ||
132 | } | 175 | } |
133 | 176 | ||
134 | if (asset != null) | 177 | if (asset != null && asset.FullID == assetID) |
135 | { | 178 | { |
136 | if (asset.FullID == assetID) | 179 | asset.Name = item.inventoryName; |
137 | { | 180 | asset.Description = item.inventoryDescription; |
138 | asset.Name = item.inventoryName; | 181 | asset.InvType = (sbyte) item.invType; |
139 | asset.Description = item.inventoryDescription; | 182 | asset.Type = (sbyte) item.assetType; |
140 | asset.InvType = (sbyte) item.invType; | 183 | item.assetID = asset.FullID; |
141 | asset.Type = (sbyte) item.assetType; | 184 | |
142 | item.assetID = asset.FullID; | 185 | addAsset = true; |
143 | |||
144 | if (addToCache) | ||
145 | { | ||
146 | AssetCache.AddAsset(asset); | ||
147 | } | ||
148 | |||
149 | userInfo.UpdateItem(remoteClient.AgentId, item); | ||
150 | } | ||
151 | } | 186 | } |
152 | } | 187 | } |
153 | } | 188 | } |
189 | |||
190 | if (asset != null) | ||
191 | { | ||
192 | if (addAsset) | ||
193 | { | ||
194 | AssetCache.AddAsset(asset); | ||
195 | } | ||
196 | |||
197 | userInfo.UpdateItem(remoteClient.AgentId, item); | ||
198 | } | ||
199 | } | ||
200 | else | ||
201 | { | ||
202 | OpenSim.Framework.Console.MainLog.Instance.Warn( | ||
203 | "Item ID " + itemID + " not found for an inventory item update."); | ||
154 | } | 204 | } |
155 | } | 205 | } |
206 | else | ||
207 | { | ||
208 | OpenSim.Framework.Console.MainLog.Instance.Warn( | ||
209 | "Agent ID " + remoteClient.AgentId + " not found for an inventory item update."); | ||
210 | } | ||
156 | } | 211 | } |
157 | 212 | ||
158 | public void CopyInventoryItem(IClientAPI remoteClient, uint callbackID, LLUUID oldAgentID, LLUUID oldItemID, LLUUID newFolderID, string newName) | 213 | public void CopyInventoryItem(IClientAPI remoteClient, uint callbackID, LLUUID oldAgentID, LLUUID oldItemID, LLUUID newFolderID, string newName) |
@@ -507,4 +562,4 @@ namespace OpenSim.Region.Environment.Scenes | |||
507 | rootPart.ScheduleFullUpdate(); | 562 | rootPart.ScheduleFullUpdate(); |
508 | } | 563 | } |
509 | } | 564 | } |
510 | } \ No newline at end of file | 565 | } |