* Implment task inventory item asset update for the old non CAPS transaction system
* This means that saving notecards in prim inventories should now work. * Not the nicest code in the world - the transactions system is pretty fugly right now * PLEASE NOTE: Currently, the prim will not repersist until up to 15 seconds after it is unselected. * What we really need is a proper mechanism so that any prim updates still waiting when the simulator is quit are performed before exit.0.6.0-stable
							parent
							
								
									9c26c8c8da
								
							
						
					
					
						commit
						7ee1f3dff6
					
				| 
						 | 
				
			
			@ -27,6 +27,7 @@
 | 
			
		|||
 | 
			
		||||
using OpenMetaverse;
 | 
			
		||||
using OpenSim.Framework;
 | 
			
		||||
using OpenSim.Region.Environment.Scenes;
 | 
			
		||||
 | 
			
		||||
namespace OpenSim.Region.Environment.Interfaces
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -38,6 +39,9 @@ namespace OpenSim.Region.Environment.Interfaces
 | 
			
		|||
        void HandleItemCreationFromTransaction(IClientAPI remoteClient, UUID transactionID, UUID folderID,
 | 
			
		||||
                                               uint callbackID, string description, string name, sbyte invType,
 | 
			
		||||
                                               sbyte type, byte wearableType, uint nextOwnerMask);
 | 
			
		||||
        
 | 
			
		||||
        void HandleTaskItemUpdateFromTransaction(
 | 
			
		||||
            IClientAPI remoteClient, SceneObjectPart part, UUID transactionID, TaskInventoryItem item);      
 | 
			
		||||
 | 
			
		||||
        void RemoveAgentAssetTransactions(UUID userID);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,10 +28,13 @@
 | 
			
		|||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using log4net;
 | 
			
		||||
using OpenMetaverse;
 | 
			
		||||
using OpenMetaverse.Packets;
 | 
			
		||||
using OpenSim.Framework;
 | 
			
		||||
using OpenSim.Framework.Communications.Cache;
 | 
			
		||||
using OpenSim.Region.Environment.Scenes;
 | 
			
		||||
 | 
			
		||||
namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -74,9 +77,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        public void HandleXfer(ulong xferID, uint packetID, byte[] data)
 | 
			
		||||
        {
 | 
			
		||||
            // AssetXferUploader uploaderFound = null;
 | 
			
		||||
 | 
			
		||||
        {         
 | 
			
		||||
            lock (XferUploaders)
 | 
			
		||||
            {
 | 
			
		||||
                foreach (AssetXferUploader uploader in XferUploaders.Values)
 | 
			
		||||
| 
						 | 
				
			
			@ -110,6 +111,15 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		|||
                XferUploaders[transactionID].RequestUpdateInventoryItem(remoteClient, transactionID, item);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        public void RequestUpdateTaskInventoryItem(
 | 
			
		||||
            IClientAPI remoteClient, SceneObjectPart part, UUID transactionID, TaskInventoryItem item)
 | 
			
		||||
        {      
 | 
			
		||||
            if (XferUploaders.ContainsKey(transactionID))
 | 
			
		||||
            {
 | 
			
		||||
                XferUploaders[transactionID].RequestUpdateTaskInventoryItem(remoteClient, part, transactionID, item);
 | 
			
		||||
            } 
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get an uploaded asset.  If the data is successfully retrieved, the transaction will be removed.
 | 
			
		||||
| 
						 | 
				
			
			@ -140,6 +150,8 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		|||
 | 
			
		||||
        public class AssetXferUploader
 | 
			
		||||
        {
 | 
			
		||||
            private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 | 
			
		||||
            
 | 
			
		||||
            // Fields
 | 
			
		||||
            public bool AddToInventory;
 | 
			
		||||
            public AssetBase Asset;
 | 
			
		||||
| 
						 | 
				
			
			@ -225,6 +237,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		|||
 | 
			
		||||
                TransactionID = transaction;
 | 
			
		||||
                m_storeLocal = storeLocal;
 | 
			
		||||
                
 | 
			
		||||
                if (Asset.Data.Length > 2)
 | 
			
		||||
                {
 | 
			
		||||
                    SendCompleteMessage();
 | 
			
		||||
| 
						 | 
				
			
			@ -251,7 +264,6 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		|||
 | 
			
		||||
                ourClient.SendAssetUploadCompleteMessage(Asset.Type, true, Asset.FullID);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                m_finished = true;
 | 
			
		||||
                if (m_createItem)
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -262,7 +274,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		|||
                    m_userTransactions.Manager.MyScene.CommsManager.AssetCache.AddAsset(Asset);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Console.WriteLine("upload complete "+ this.TransactionID);
 | 
			
		||||
                m_log.DebugFormat("[ASSET TRANSACTIONS]: Uploaded asset data for transaction {0}", TransactionID);
 | 
			
		||||
 | 
			
		||||
                if (m_dumpAssetToFile)
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -274,15 +286,6 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		|||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ///Left this in and commented in case there are unforseen issues
 | 
			
		||||
            //private void SaveAssetToFile(string filename, byte[] data)
 | 
			
		||||
            //{
 | 
			
		||||
            //    FileStream fs = File.Create(filename);
 | 
			
		||||
            //    BinaryWriter bw = new BinaryWriter(fs);
 | 
			
		||||
            //    bw.Write(data);
 | 
			
		||||
            //    bw.Close();
 | 
			
		||||
            //    fs.Close();
 | 
			
		||||
            //}
 | 
			
		||||
            private void SaveAssetToFile(string filename, byte[] data)
 | 
			
		||||
            {
 | 
			
		||||
                string assetPath = "UserAssets";
 | 
			
		||||
| 
						 | 
				
			
			@ -314,6 +317,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		|||
                    Asset.Description = description;
 | 
			
		||||
                    Asset.Type = type;
 | 
			
		||||
                    m_createItem = true;
 | 
			
		||||
                    
 | 
			
		||||
                    if (m_finished)
 | 
			
		||||
                    {
 | 
			
		||||
                        DoCreateItem();
 | 
			
		||||
| 
						 | 
				
			
			@ -359,7 +363,25 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		|||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            
 | 
			
		||||
            public void RequestUpdateTaskInventoryItem(
 | 
			
		||||
                IClientAPI remoteClient, SceneObjectPart part, UUID transactionID, TaskInventoryItem item)
 | 
			
		||||
            {
 | 
			
		||||
                m_log.DebugFormat(
 | 
			
		||||
                    "[ASSET TRANSACTIONS]: Updating task item {0} in {1} with asset in transaction {2}", 
 | 
			
		||||
                    item.Name, part.Name, transactionID);
 | 
			
		||||
                
 | 
			
		||||
                Asset.Name = item.Name;
 | 
			
		||||
                Asset.Description = item.Description;
 | 
			
		||||
                Asset.Type = (sbyte) item.Type;
 | 
			
		||||
                item.AssetID = Asset.FullID;
 | 
			
		||||
                
 | 
			
		||||
                m_userTransactions.Manager.MyScene.CommsManager.AssetCache.AddAsset(Asset);
 | 
			
		||||
                
 | 
			
		||||
                if (part.UpdateInventoryItem(item))
 | 
			
		||||
                    part.GetProperties(remoteClient);                 
 | 
			
		||||
            }              
 | 
			
		||||
                        
 | 
			
		||||
            private void DoCreateItem()
 | 
			
		||||
            {
 | 
			
		||||
                //really need to fix this call, if lbsa71 saw this he would die.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,11 +61,16 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		|||
                                                                   wearableType, nextOwnerMask);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void HandleItemUpdateFromTransaction(IClientAPI remoteClient, UUID transactionID,
 | 
			
		||||
                                                    InventoryItemBase item)
 | 
			
		||||
        public void HandleItemUpdateFromTransaction(IClientAPI remoteClient, UUID transactionID, InventoryItemBase item)
 | 
			
		||||
        {
 | 
			
		||||
            m_transactionManager.HandleItemUpdateFromTransaction(remoteClient, transactionID, item);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        public void HandleTaskItemUpdateFromTransaction(
 | 
			
		||||
            IClientAPI remoteClient, SceneObjectPart part, UUID transactionID, TaskInventoryItem item)
 | 
			
		||||
        {
 | 
			
		||||
            m_transactionManager.HandleTaskItemUpdateFromTransaction(remoteClient, part, transactionID, item);
 | 
			
		||||
        }        
 | 
			
		||||
 | 
			
		||||
        public void RemoveAgentAssetTransactions(UUID userID)
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -141,8 +146,6 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		|||
        private static readonly ILog m_log
 | 
			
		||||
            = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 | 
			
		||||
 | 
			
		||||
        // Fields
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Each agent has its own singleton collection of transactions
 | 
			
		||||
        /// </summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -218,8 +221,8 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		|||
                                                      uint callbackID, string description, string name, sbyte invType,
 | 
			
		||||
                                                      sbyte type, byte wearableType, uint nextOwnerMask)
 | 
			
		||||
        {
 | 
			
		||||
            m_log.DebugFormat(
 | 
			
		||||
                "[TRANSACTIONS MANAGER] Called HandleItemCreationFromTransaction with item {0}", name);
 | 
			
		||||
//            m_log.DebugFormat(
 | 
			
		||||
//                "[TRANSACTIONS MANAGER] Called HandleItemCreationFromTransaction with item {0}", name);
 | 
			
		||||
 | 
			
		||||
            AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -240,15 +243,36 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		|||
        public void HandleItemUpdateFromTransaction(IClientAPI remoteClient, UUID transactionID,
 | 
			
		||||
                                                    InventoryItemBase item)
 | 
			
		||||
        {
 | 
			
		||||
            m_log.DebugFormat(
 | 
			
		||||
                "[TRANSACTIONS MANAGER] Called HandleItemUpdateFromTransaction with item {0}",
 | 
			
		||||
                item.Name);
 | 
			
		||||
//            m_log.DebugFormat(
 | 
			
		||||
//                "[TRANSACTIONS MANAGER] Called HandleItemUpdateFromTransaction with item {0}",
 | 
			
		||||
//                item.Name);
 | 
			
		||||
 | 
			
		||||
            AgentAssetTransactions transactions
 | 
			
		||||
                = GetUserTransactions(remoteClient.AgentId);
 | 
			
		||||
            AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
 | 
			
		||||
 | 
			
		||||
            transactions.RequestUpdateInventoryItem(remoteClient, transactionID, item);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Update a task inventory item with data that has been received through a transaction.
 | 
			
		||||
        ///
 | 
			
		||||
        /// This is currently called when, for instance, a notecard in a prim is saved.  The data is sent
 | 
			
		||||
        /// up through a single AssetUploadRequest.  A subsequent UpdateTaskInventory then references the transaction
 | 
			
		||||
        /// and comes through this method.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="remoteClient"></param>
 | 
			
		||||
        /// <param name="transactionID"></param>
 | 
			
		||||
        /// <param name="item"></param>
 | 
			
		||||
        public void HandleTaskItemUpdateFromTransaction(
 | 
			
		||||
            IClientAPI remoteClient, SceneObjectPart part, UUID transactionID, TaskInventoryItem item)
 | 
			
		||||
        {
 | 
			
		||||
//            m_log.DebugFormat(
 | 
			
		||||
//                "[TRANSACTIONS MANAGER] Called HandleTaskItemUpdateFromTransaction with item {0}",
 | 
			
		||||
//                item.Name);
 | 
			
		||||
 | 
			
		||||
            AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
 | 
			
		||||
 | 
			
		||||
            transactions.RequestUpdateTaskInventoryItem(remoteClient, part, transactionID, item);
 | 
			
		||||
        }               
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Request that a client (agent) begin an asset transfer.
 | 
			
		||||
| 
						 | 
				
			
			@ -270,6 +294,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		|||
            {
 | 
			
		||||
                Scene scene = (Scene)remoteClient.Scene;
 | 
			
		||||
                IMoneyModule mm = scene.RequestModuleInterface<IMoneyModule>();
 | 
			
		||||
                
 | 
			
		||||
                if (mm != null)
 | 
			
		||||
                {
 | 
			
		||||
                    if (!mm.UploadCovered(remoteClient))
 | 
			
		||||
| 
						 | 
				
			
			@ -280,15 +305,13 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction
 | 
			
		|||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Console.WriteLine("asset upload of " + assetID);
 | 
			
		||||
            //Console.WriteLine("asset upload of " + assetID);
 | 
			
		||||
            AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
 | 
			
		||||
 | 
			
		||||
            AgentAssetTransactions.AssetXferUploader uploader = transactions.RequestXferUploader(transaction);
 | 
			
		||||
            if (uploader != null)
 | 
			
		||||
            {
 | 
			
		||||
                if (uploader.Initialise(remoteClient, assetID, transaction, type, data, storeLocal, tempFile))
 | 
			
		||||
                {
 | 
			
		||||
                }
 | 
			
		||||
                uploader.Initialise(remoteClient, assetID, transaction, type, data, storeLocal, tempFile);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1256,12 +1256,13 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else // Updating existing item with new perms etc
 | 
			
		||||
                {
 | 
			
		||||
                    TaskInventoryItem prevItem = part.GetInventoryItem(itemID);
 | 
			
		||||
System.Console.WriteLine("Item asset {0}, request asset {1}", prevItem.AssetID.ToString(), itemInfo.AssetID.ToString());
 | 
			
		||||
                    itemInfo.AssetID = prevItem.AssetID;
 | 
			
		||||
                    if (part.UpdateInventoryItem(itemInfo))
 | 
			
		||||
                        part.GetProperties(remoteClient);
 | 
			
		||||
                {                    
 | 
			
		||||
                    IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>();
 | 
			
		||||
                    if (agentTransactions != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        agentTransactions.HandleTaskItemUpdateFromTransaction(
 | 
			
		||||
                            remoteClient, part, transactionID, currentItem);
 | 
			
		||||
                    }                    
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue