diff options
3 files changed, 52 insertions, 64 deletions
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs index bba7b9c..59d0075 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs | |||
@@ -155,56 +155,13 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | |||
155 | description, name, invType, type, wearableType, nextOwnerMask); | 155 | description, name, invType, type, wearableType, nextOwnerMask); |
156 | } | 156 | } |
157 | 157 | ||
158 | /// <summary> | ||
159 | /// Get an uploaded asset. If the data is successfully retrieved, | ||
160 | /// the transaction will be removed. | ||
161 | /// </summary> | ||
162 | /// <param name="transactionID"></param> | ||
163 | /// <returns>The asset if the upload has completed, null if it has not.</returns> | ||
164 | private AssetBase GetTransactionAsset(UUID transactionID) | ||
165 | { | ||
166 | lock (XferUploaders) | ||
167 | { | ||
168 | if (XferUploaders.ContainsKey(transactionID)) | ||
169 | { | ||
170 | AssetXferUploader uploader = XferUploaders[transactionID]; | ||
171 | AssetBase asset = uploader.GetAssetData(); | ||
172 | RemoveXferUploader(transactionID); | ||
173 | |||
174 | return asset; | ||
175 | } | ||
176 | } | ||
177 | |||
178 | return null; | ||
179 | } | ||
180 | |||
181 | public void RequestUpdateTaskInventoryItem(IClientAPI remoteClient, | 158 | public void RequestUpdateTaskInventoryItem(IClientAPI remoteClient, |
182 | SceneObjectPart part, UUID transactionID, | 159 | SceneObjectPart part, UUID transactionID, |
183 | TaskInventoryItem item) | 160 | TaskInventoryItem item) |
184 | { | 161 | { |
185 | AssetBase asset = GetTransactionAsset(transactionID); | 162 | AssetXferUploader uploader = RequestXferUploader(transactionID); |
186 | |||
187 | // Only legacy viewers use this, and they prefer CAPS, which | ||
188 | // we have, so this really never runs. | ||
189 | // Allow it, but only for "safe" types. | ||
190 | if ((InventoryType)item.InvType != InventoryType.Notecard && | ||
191 | (InventoryType)item.InvType != InventoryType.LSL) | ||
192 | return; | ||
193 | 163 | ||
194 | if (asset != null) | 164 | uploader.RequestUpdateTaskInventoryItem(remoteClient, transactionID, item); |
195 | { | ||
196 | // m_log.DebugFormat( | ||
197 | // "[AGENT ASSETS TRANSACTIONS]: Updating item {0} in {1} for transaction {2}", | ||
198 | // item.Name, part.Name, transactionID); | ||
199 | |||
200 | asset.FullID = UUID.Random(); | ||
201 | asset.Name = item.Name; | ||
202 | asset.Description = item.Description; | ||
203 | asset.Type = (sbyte)item.Type; | ||
204 | item.AssetID = asset.FullID; | ||
205 | |||
206 | m_Scene.AssetService.Store(asset); | ||
207 | } | ||
208 | } | 165 | } |
209 | 166 | ||
210 | public void RequestUpdateInventoryItem(IClientAPI remoteClient, | 167 | public void RequestUpdateInventoryItem(IClientAPI remoteClient, |
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs index 10a0794..73d1f72 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs | |||
@@ -215,7 +215,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | |||
215 | IClientAPI remoteClient, SceneObjectPart part, UUID transactionID, TaskInventoryItem item) | 215 | IClientAPI remoteClient, SceneObjectPart part, UUID transactionID, TaskInventoryItem item) |
216 | { | 216 | { |
217 | m_log.DebugFormat( | 217 | m_log.DebugFormat( |
218 | "[TRANSACTIONS MANAGER] Called HandleTaskItemUpdateFromTransaction with item {0} in {1} for {2} in {3}", | 218 | "[ASSET TRANSACTION MODULE] Called HandleTaskItemUpdateFromTransaction with item {0} in {1} for {2} in {3}", |
219 | item.Name, part.Name, remoteClient.Name, m_Scene.RegionInfo.RegionName); | 219 | item.Name, part.Name, remoteClient.Name, m_Scene.RegionInfo.RegionName); |
220 | 220 | ||
221 | AgentAssetTransactions transactions = | 221 | AgentAssetTransactions transactions = |
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs index 9f05120..08c3134 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs | |||
@@ -65,11 +65,15 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | |||
65 | private UUID InventFolder = UUID.Zero; | 65 | private UUID InventFolder = UUID.Zero; |
66 | private sbyte invType = 0; | 66 | private sbyte invType = 0; |
67 | 67 | ||
68 | private bool m_createItem = false; | 68 | private bool m_createItem; |
69 | private uint m_createItemCallback = 0; | 69 | private uint m_createItemCallback; |
70 | private bool m_updateItem = false; | 70 | |
71 | private bool m_updateItem; | ||
71 | private InventoryItemBase m_updateItemData; | 72 | private InventoryItemBase m_updateItemData; |
72 | 73 | ||
74 | private bool m_updateTaskItem; | ||
75 | private TaskInventoryItem m_updateTaskItemData; | ||
76 | |||
73 | private string m_description = String.Empty; | 77 | private string m_description = String.Empty; |
74 | private bool m_dumpAssetToFile; | 78 | private bool m_dumpAssetToFile; |
75 | private string m_name = String.Empty; | 79 | private string m_name = String.Empty; |
@@ -223,6 +227,12 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | |||
223 | // TODO: Should probably do the same for create item. | 227 | // TODO: Should probably do the same for create item. |
224 | m_transactions.RemoveXferUploader(TransactionID); | 228 | m_transactions.RemoveXferUploader(TransactionID); |
225 | } | 229 | } |
230 | else if (m_updateTaskItem) | ||
231 | { | ||
232 | StoreAssetForTaskItemUpdate(m_updateTaskItemData); | ||
233 | |||
234 | m_transactions.RemoveXferUploader(TransactionID); | ||
235 | } | ||
226 | else if (m_storeLocal) | 236 | else if (m_storeLocal) |
227 | { | 237 | { |
228 | m_Scene.AssetService.Store(m_asset); | 238 | m_Scene.AssetService.Store(m_asset); |
@@ -323,8 +333,30 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | |||
323 | } | 333 | } |
324 | } | 334 | } |
325 | 335 | ||
336 | public void RequestUpdateTaskInventoryItem(IClientAPI remoteClient, UUID transactionID, TaskInventoryItem taskItem) | ||
337 | { | ||
338 | // We must lock to avoid a race with a separate thread uploading the asset. | ||
339 | lock (this) | ||
340 | { | ||
341 | m_asset.Name = taskItem.Name; | ||
342 | m_asset.Description = taskItem.Description; | ||
343 | m_asset.Type = (sbyte)taskItem.Type; | ||
344 | taskItem.AssetID = m_asset.FullID; | ||
345 | |||
346 | if (m_uploadState == UploadState.Complete) | ||
347 | { | ||
348 | StoreAssetForTaskItemUpdate(taskItem); | ||
349 | } | ||
350 | else | ||
351 | { | ||
352 | m_updateTaskItem = true; | ||
353 | m_updateTaskItemData = taskItem; | ||
354 | } | ||
355 | } | ||
356 | } | ||
357 | |||
326 | /// <summary> | 358 | /// <summary> |
327 | /// Store the asset for the given item. | 359 | /// Store the asset for the given item when it has been uploaded. |
328 | /// </summary> | 360 | /// </summary> |
329 | /// <param name="item"></param> | 361 | /// <param name="item"></param> |
330 | private void StoreAssetForItemUpdate(InventoryItemBase item) | 362 | private void StoreAssetForItemUpdate(InventoryItemBase item) |
@@ -336,6 +368,19 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | |||
336 | m_Scene.AssetService.Store(m_asset); | 368 | m_Scene.AssetService.Store(m_asset); |
337 | } | 369 | } |
338 | 370 | ||
371 | /// <summary> | ||
372 | /// Store the asset for the given task item when it has been uploaded. | ||
373 | /// </summary> | ||
374 | /// <param name="taskItem"></param> | ||
375 | private void StoreAssetForTaskItemUpdate(TaskInventoryItem taskItem) | ||
376 | { | ||
377 | // m_log.DebugFormat( | ||
378 | // "[ASSET XFER UPLOADER]: Storing asset {0} for earlier task item update for {1} for {2}", | ||
379 | // m_asset.FullID, taskItem.Name, ourClient.Name); | ||
380 | |||
381 | m_Scene.AssetService.Store(m_asset); | ||
382 | } | ||
383 | |||
339 | private void DoCreateItem(uint callbackID) | 384 | private void DoCreateItem(uint callbackID) |
340 | { | 385 | { |
341 | m_Scene.AssetService.Store(m_asset); | 386 | m_Scene.AssetService.Store(m_asset); |
@@ -363,19 +408,5 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | |||
363 | else | 408 | else |
364 | ourClient.SendAlertMessage("Unable to create inventory item"); | 409 | ourClient.SendAlertMessage("Unable to create inventory item"); |
365 | } | 410 | } |
366 | |||
367 | /// <summary> | ||
368 | /// Get the asset data uploaded in this transfer. | ||
369 | /// </summary> | ||
370 | /// <returns>null if the asset has not finished uploading</returns> | ||
371 | public AssetBase GetAssetData() | ||
372 | { | ||
373 | if (m_uploadState == UploadState.Complete) | ||
374 | { | ||
375 | return m_asset; | ||
376 | } | ||
377 | |||
378 | return null; | ||
379 | } | ||
380 | } | 411 | } |
381 | } \ No newline at end of file | 412 | } \ No newline at end of file |