Moved the AgentAssetTransactionsManager (and AgentAssetTransactions) out of CommsManager and into a module (AgentAgentTransactionModule), still needs cleaning up though.
But its one more thing out of the CommsManager. One day we will kill the CommsManager!ThreadPoolClientBranch
							parent
							
								
									694dff3b70
								
							
						
					
					
						commit
						b618802e53
					
				| 
						 | 
				
			
			@ -25,6 +25,8 @@
 | 
			
		|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
* 
 | 
			
		||||
*/
 | 
			
		||||
//moved to a module, left here until the module is found to have no problems
 | 
			
		||||
/*
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
| 
						 | 
				
			
			@ -553,3 +555,4 @@ namespace OpenSim.Framework.Communications.Cache
 | 
			
		|||
        #endregion
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
| 
						 | 
				
			
			@ -26,6 +26,8 @@
 | 
			
		|||
* 
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
//moved to a module, left here until the module is found to have no problems
 | 
			
		||||
/*
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -181,7 +183,7 @@ namespace OpenSim.Framework.Communications.Cache
 | 
			
		|||
                        
 | 
			
		||||
                        //m_log.InfoFormat("[ASSET TRANSACTIONS] Current uploaders: {0}", transactions.XferUploaders.Count);                        
 | 
			
		||||
                    }*/
 | 
			
		||||
                }
 | 
			
		||||
         /*       }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -201,3 +203,4 @@ namespace OpenSim.Framework.Communications.Cache
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
| 
						 | 
				
			
			@ -73,12 +73,12 @@ namespace OpenSim.Framework.Communications
 | 
			
		|||
            get { return m_userProfileCacheService; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected AgentAssetTransactionsManager m_transactionsManager;
 | 
			
		||||
      //  protected AgentAssetTransactionsManager m_transactionsManager;
 | 
			
		||||
 | 
			
		||||
        public AgentAssetTransactionsManager TransactionsManager
 | 
			
		||||
        {
 | 
			
		||||
            get { return m_transactionsManager; }
 | 
			
		||||
        }
 | 
			
		||||
       // public AgentAssetTransactionsManager TransactionsManager
 | 
			
		||||
      //  {
 | 
			
		||||
      //      get { return m_transactionsManager; }
 | 
			
		||||
      //  }
 | 
			
		||||
 | 
			
		||||
        protected AssetCache m_assetCache;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -100,7 +100,7 @@ namespace OpenSim.Framework.Communications
 | 
			
		|||
            m_networkServersInfo = serversInfo;
 | 
			
		||||
            m_assetCache = assetCache;
 | 
			
		||||
            m_userProfileCacheService = new UserProfileCacheService(this);
 | 
			
		||||
            m_transactionsManager = new AgentAssetTransactionsManager(this, dumpAssetsToFile);
 | 
			
		||||
         //   m_transactionsManager = new AgentAssetTransactionsManager(this, dumpAssetsToFile);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void doCreate(string[] cmmdParams)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,244 @@
 | 
			
		|||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using libsecondlife;
 | 
			
		||||
using Nini.Config;
 | 
			
		||||
using OpenSim.Framework;
 | 
			
		||||
using OpenSim.Region.Environment.Interfaces;
 | 
			
		||||
using OpenSim.Region.Environment.Scenes;
 | 
			
		||||
 | 
			
		||||
namespace OpenSim.Region.Environment.Modules
 | 
			
		||||
{
 | 
			
		||||
    public class AgentAgentTransactionModule : IRegionModule, IAgentAssetTransactions
 | 
			
		||||
    {
 | 
			
		||||
        private Dictionary<LLUUID, Scene> RegisteredScenes = new Dictionary<LLUUID, Scene>();
 | 
			
		||||
        private Scene m_scene = null;
 | 
			
		||||
        private bool m_dumpAssetsToFile = false;
 | 
			
		||||
 | 
			
		||||
        private AgentAssetTransactionsManager m_transactionManager;
 | 
			
		||||
 | 
			
		||||
        public void Initialise(Scene scene, IConfigSource config)
 | 
			
		||||
        {
 | 
			
		||||
            if (!RegisteredScenes.ContainsKey(scene.RegionInfo.RegionID))
 | 
			
		||||
            {
 | 
			
		||||
                RegisteredScenes.Add(scene.RegionInfo.RegionID, scene);
 | 
			
		||||
                scene.RegisterModuleInterface<IAgentAssetTransactions>(this);
 | 
			
		||||
 | 
			
		||||
                scene.EventManager.OnNewClient += NewClient;
 | 
			
		||||
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    m_dumpAssetsToFile = config.Configs["StandAlone"].GetBoolean("dump_assets_to_file", false);
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception)
 | 
			
		||||
                {
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (m_scene == null)
 | 
			
		||||
            {
 | 
			
		||||
                m_scene = scene;
 | 
			
		||||
                m_transactionManager = new AgentAssetTransactionsManager(m_scene, m_dumpAssetsToFile);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void PostInitialise()
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void Close()
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public string Name
 | 
			
		||||
        {
 | 
			
		||||
            get { return "AgentTransactionModule"; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public bool IsSharedModule
 | 
			
		||||
        {
 | 
			
		||||
            get { return true; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void NewClient(IClientAPI client)
 | 
			
		||||
        {
 | 
			
		||||
            client.OnAssetUploadRequest += m_transactionManager.HandleUDPUploadRequest;
 | 
			
		||||
            client.OnXferReceive += m_transactionManager.HandleXfer;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void HandleItemCreationFromTransaction(IClientAPI remoteClient, LLUUID transactionID, LLUUID folderID,
 | 
			
		||||
                                                   uint callbackID, string description, string name, sbyte invType,
 | 
			
		||||
                                                   sbyte type, byte wearableType, uint nextOwnerMask)
 | 
			
		||||
        {
 | 
			
		||||
            m_transactionManager.HandleItemCreationFromTransaction(remoteClient, transactionID, folderID, callbackID, description, name, invType, type, wearableType, nextOwnerMask);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void HandleItemUpdateFromTransaction(IClientAPI remoteClient, LLUUID transactionID,
 | 
			
		||||
                                               InventoryItemBase item)
 | 
			
		||||
        {
 | 
			
		||||
            m_transactionManager.HandleItemUpdateFromTransaction(remoteClient, transactionID, item);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void RemoveAgentAssetTransactions(LLUUID userID)
 | 
			
		||||
        {
 | 
			
		||||
            m_transactionManager.RemoveAgentAssetTransactions(userID);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //should merge this classes and clean up
 | 
			
		||||
    public class AgentAssetTransactionsManager
 | 
			
		||||
    {
 | 
			
		||||
        private static readonly log4net.ILog m_log
 | 
			
		||||
            = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
 | 
			
		||||
 | 
			
		||||
        // Fields
 | 
			
		||||
        public Scene MyScene;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Each agent has its own singleton collection of transactions
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        private Dictionary<LLUUID, AgentAssetTransactions> AgentTransactions =
 | 
			
		||||
            new Dictionary<LLUUID, AgentAssetTransactions>();
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Should we dump uploaded assets to the filesystem?
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        private bool m_dumpAssetsToFile;
 | 
			
		||||
 | 
			
		||||
        public AgentAssetTransactionsManager(Scene scene, bool dumpAssetsToFile)
 | 
			
		||||
        {
 | 
			
		||||
            MyScene = scene;
 | 
			
		||||
            m_dumpAssetsToFile = dumpAssetsToFile;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get the collection of asset transactions for the given user.  If one does not already exist, it
 | 
			
		||||
        /// is created.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="userID"></param>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        private AgentAssetTransactions GetUserTransactions(LLUUID userID)
 | 
			
		||||
        {
 | 
			
		||||
            lock (AgentTransactions)
 | 
			
		||||
            {
 | 
			
		||||
                if (!AgentTransactions.ContainsKey(userID))
 | 
			
		||||
                {
 | 
			
		||||
                    AgentAssetTransactions transactions
 | 
			
		||||
                        = new AgentAssetTransactions(userID, this, m_dumpAssetsToFile);
 | 
			
		||||
                    AgentTransactions.Add(userID, transactions);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return AgentTransactions[userID];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Remove the given agent asset transactions.  This should be called when a client is departing
 | 
			
		||||
        /// from a scene (and hence won't be making any more transactions here).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="userID"></param>
 | 
			
		||||
        public void RemoveAgentAssetTransactions(LLUUID userID)
 | 
			
		||||
        {
 | 
			
		||||
            // m_log.DebugFormat("Removing agent asset transactions structure for agent {0}", userID);
 | 
			
		||||
 | 
			
		||||
            lock (AgentTransactions)
 | 
			
		||||
            {
 | 
			
		||||
                AgentTransactions.Remove(userID);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Create an inventory item from data that has been received through a transaction.
 | 
			
		||||
        /// 
 | 
			
		||||
        /// This is called when new clothing or body parts are created.  It may also be called in other
 | 
			
		||||
        /// situations.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="remoteClient"></param>
 | 
			
		||||
        /// <param name="transactionID"></param>
 | 
			
		||||
        /// <param name="folderID"></param>
 | 
			
		||||
        /// <param name="callbackID"></param>
 | 
			
		||||
        /// <param name="description"></param>
 | 
			
		||||
        /// <param name="name"></param>
 | 
			
		||||
        /// <param name="invType"></param>
 | 
			
		||||
        /// <param name="type"></param>
 | 
			
		||||
        /// <param name="wearableType"></param>
 | 
			
		||||
        /// <param name="nextOwnerMask"></param>
 | 
			
		||||
        public void HandleItemCreationFromTransaction(IClientAPI remoteClient, LLUUID transactionID, LLUUID folderID,
 | 
			
		||||
                                                      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);
 | 
			
		||||
 | 
			
		||||
            AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
 | 
			
		||||
 | 
			
		||||
            transactions.RequestCreateInventoryItem(
 | 
			
		||||
                remoteClient, transactionID, folderID, callbackID, description,
 | 
			
		||||
                name, invType, type, wearableType, nextOwnerMask);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Update an inventory item with data that has been received through a transaction.
 | 
			
		||||
        /// 
 | 
			
		||||
        /// This is called when clothing or body parts are updated (for instance, with new textures or 
 | 
			
		||||
        /// colours).  It may also be called in other situations.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="remoteClient"></param>
 | 
			
		||||
        /// <param name="transactionID"></param>
 | 
			
		||||
        /// <param name="item"></param>
 | 
			
		||||
        public void HandleItemUpdateFromTransaction(IClientAPI remoteClient, LLUUID transactionID,
 | 
			
		||||
                                                    InventoryItemBase item)
 | 
			
		||||
        {
 | 
			
		||||
            m_log.DebugFormat(
 | 
			
		||||
               "[TRANSACTIONS MANAGER] Called HandleItemUpdateFromTransaction with item {0}",
 | 
			
		||||
                item.inventoryName);
 | 
			
		||||
 | 
			
		||||
            AgentAssetTransactions transactions
 | 
			
		||||
                = GetUserTransactions(remoteClient.AgentId);
 | 
			
		||||
 | 
			
		||||
            transactions.RequestUpdateInventoryItem(remoteClient, transactionID, item);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Request that a client (agent) begin an asset transfer.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="remoteClient"></param>
 | 
			
		||||
        /// <param name="assetID"></param>
 | 
			
		||||
        /// <param name="transaction"></param>
 | 
			
		||||
        /// <param name="type"></param>
 | 
			
		||||
        /// <param name="data"></param></param>
 | 
			
		||||
        /// <param name="tempFile"></param>
 | 
			
		||||
        public void HandleUDPUploadRequest(IClientAPI remoteClient, LLUUID assetID, LLUUID transaction, sbyte type,
 | 
			
		||||
                                           byte[] data, bool storeLocal, bool tempFile)
 | 
			
		||||
        {
 | 
			
		||||
            // 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))
 | 
			
		||||
                {
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Handle asset transfer data packets received in response to the asset upload request in
 | 
			
		||||
        /// HandleUDPUploadRequest()
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="remoteClient"></param>
 | 
			
		||||
        /// <param name="xferID"></param>
 | 
			
		||||
        /// <param name="packetID"></param>
 | 
			
		||||
        /// <param name="data"></param>
 | 
			
		||||
        public void HandleXfer(IClientAPI remoteClient, ulong xferID, uint packetID, byte[] data)
 | 
			
		||||
        {
 | 
			
		||||
            AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
 | 
			
		||||
 | 
			
		||||
            transactions.HandleXfer(xferID, packetID, data);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,382 @@
 | 
			
		|||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using libsecondlife;
 | 
			
		||||
using libsecondlife.Packets;
 | 
			
		||||
using OpenSim.Framework.Servers;
 | 
			
		||||
using OpenSim.Framework;
 | 
			
		||||
using OpenSim.Framework.Communications.Cache;
 | 
			
		||||
 | 
			
		||||
namespace OpenSim.Region.Environment.Modules
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Manage asset transactions for a single agent.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public class AgentAssetTransactions
 | 
			
		||||
    {
 | 
			
		||||
        //private static readonly log4net.ILog m_log 
 | 
			
		||||
         //   = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
 | 
			
		||||
        
 | 
			
		||||
        // Fields
 | 
			
		||||
        public LLUUID UserID;
 | 
			
		||||
        public Dictionary<LLUUID, AssetXferUploader> XferUploaders = new Dictionary<LLUUID, AssetXferUploader>();
 | 
			
		||||
        public AgentAssetTransactionsManager Manager;
 | 
			
		||||
        private bool m_dumpAssetsToFile;
 | 
			
		||||
 | 
			
		||||
        // Methods
 | 
			
		||||
        public AgentAssetTransactions(LLUUID agentID, AgentAssetTransactionsManager manager, bool dumpAssetsToFile)
 | 
			
		||||
        {
 | 
			
		||||
            UserID = agentID;
 | 
			
		||||
            Manager = manager;
 | 
			
		||||
            m_dumpAssetsToFile = dumpAssetsToFile;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public AssetXferUploader RequestXferUploader(LLUUID transactionID)
 | 
			
		||||
        {
 | 
			
		||||
            if (!XferUploaders.ContainsKey(transactionID))
 | 
			
		||||
            {
 | 
			
		||||
                AssetXferUploader uploader = new AssetXferUploader(this, m_dumpAssetsToFile);
 | 
			
		||||
 | 
			
		||||
                lock (XferUploaders)
 | 
			
		||||
                {
 | 
			
		||||
                    XferUploaders.Add(transactionID, uploader);
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                return uploader;
 | 
			
		||||
            }
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void HandleXfer(ulong xferID, uint packetID, byte[] data)
 | 
			
		||||
        {
 | 
			
		||||
            AssetXferUploader uploaderFound = null;
 | 
			
		||||
            
 | 
			
		||||
            lock (XferUploaders)
 | 
			
		||||
            {
 | 
			
		||||
                foreach (AssetXferUploader uploader in XferUploaders.Values)
 | 
			
		||||
                {
 | 
			
		||||
                    if (uploader.XferID == xferID)
 | 
			
		||||
                    {   
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                          
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void RequestCreateInventoryItem(IClientAPI remoteClient, LLUUID transactionID, LLUUID folderID,
 | 
			
		||||
                                               uint callbackID, string description, string name, sbyte invType,
 | 
			
		||||
                                               sbyte type, byte wearableType, uint nextOwnerMask)
 | 
			
		||||
        {
 | 
			
		||||
            if (XferUploaders.ContainsKey(transactionID))
 | 
			
		||||
            {
 | 
			
		||||
                XferUploaders[transactionID].RequestCreateInventoryItem(remoteClient, transactionID, folderID,
 | 
			
		||||
                                                                        callbackID, description, name, invType, type,
 | 
			
		||||
                                                                        wearableType, nextOwnerMask);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        public void RequestUpdateInventoryItem(IClientAPI remoteClient, LLUUID transactionID, 
 | 
			
		||||
                                               InventoryItemBase item)
 | 
			
		||||
        {
 | 
			
		||||
            if (XferUploaders.ContainsKey(transactionID))
 | 
			
		||||
            {
 | 
			
		||||
                XferUploaders[transactionID].RequestUpdateInventoryItem(remoteClient, transactionID, item);
 | 
			
		||||
            }
 | 
			
		||||
        }        
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get an uploaded asset.  If the data is successfully retrieved, the transaction will be removed.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="transactionID"></param>
 | 
			
		||||
        /// <returns>The asset if the upload has completed, null if it has not.</returns>
 | 
			
		||||
        public AssetBase GetTransactionAsset(LLUUID transactionID)
 | 
			
		||||
        {
 | 
			
		||||
            if (XferUploaders.ContainsKey(transactionID))
 | 
			
		||||
            {
 | 
			
		||||
                AssetXferUploader uploader = XferUploaders[transactionID];
 | 
			
		||||
                AssetBase asset = uploader.GetAssetData();
 | 
			
		||||
                
 | 
			
		||||
                lock (XferUploaders)
 | 
			
		||||
                {
 | 
			
		||||
                    XferUploaders.Remove(transactionID);
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                return asset;
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Nested Types
 | 
			
		||||
        public class AssetXferUploader
 | 
			
		||||
        {
 | 
			
		||||
            // Fields
 | 
			
		||||
            public bool AddToInventory;
 | 
			
		||||
            public AssetBase Asset;
 | 
			
		||||
            public LLUUID InventFolder = LLUUID.Zero;
 | 
			
		||||
            private IClientAPI ourClient;
 | 
			
		||||
            public LLUUID TransactionID = LLUUID.Zero;
 | 
			
		||||
            public bool UploadComplete;
 | 
			
		||||
            public ulong XferID;
 | 
			
		||||
            private string m_name = String.Empty;
 | 
			
		||||
            private string m_description = String.Empty;
 | 
			
		||||
            private sbyte type = 0;
 | 
			
		||||
            private sbyte invType = 0;
 | 
			
		||||
            private uint nextPerm = 0;
 | 
			
		||||
            private bool m_finished = false;
 | 
			
		||||
            private bool m_createItem = false;
 | 
			
		||||
            private AgentAssetTransactions m_userTransactions;
 | 
			
		||||
            private bool m_storeLocal;
 | 
			
		||||
            private bool m_dumpAssetToFile;
 | 
			
		||||
 | 
			
		||||
            public AssetXferUploader(AgentAssetTransactions transactions, bool dumpAssetToFile)
 | 
			
		||||
            {
 | 
			
		||||
                m_userTransactions = transactions;
 | 
			
		||||
                m_dumpAssetToFile = dumpAssetToFile;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            /// <summary>
 | 
			
		||||
            /// Process transfer data received from the client.
 | 
			
		||||
            /// </summary>
 | 
			
		||||
            /// <param name="xferID"></param>
 | 
			
		||||
            /// <param name="packetID"></param>
 | 
			
		||||
            /// <param name="data"></param>
 | 
			
		||||
            /// <returns>True if the transfer is complete, false otherwise or if the xferID was not valid</returns>
 | 
			
		||||
            public bool HandleXferPacket(ulong xferID, uint packetID, byte[] data)
 | 
			
		||||
            {
 | 
			
		||||
                if (XferID == xferID)
 | 
			
		||||
                {
 | 
			
		||||
                    if (Asset.Data.Length > 1)
 | 
			
		||||
                    {
 | 
			
		||||
                        byte[] destinationArray = new byte[Asset.Data.Length + data.Length];
 | 
			
		||||
                        Array.Copy(Asset.Data, 0, destinationArray, 0, Asset.Data.Length);
 | 
			
		||||
                        Array.Copy(data, 0, destinationArray, Asset.Data.Length, data.Length);
 | 
			
		||||
                        Asset.Data = destinationArray;
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        byte[] buffer2 = new byte[data.Length - 4];
 | 
			
		||||
                        Array.Copy(data, 4, buffer2, 0, data.Length - 4);
 | 
			
		||||
                        Asset.Data = buffer2;
 | 
			
		||||
                    }
 | 
			
		||||
                    ConfirmXferPacketPacket newPack = new ConfirmXferPacketPacket();
 | 
			
		||||
                    newPack.XferID.ID = xferID;
 | 
			
		||||
                    newPack.XferID.Packet = packetID;
 | 
			
		||||
                    ourClient.OutPacket(newPack, ThrottleOutPacketType.Asset);
 | 
			
		||||
                    if ((packetID & 0x80000000) != 0)
 | 
			
		||||
                    {
 | 
			
		||||
                        SendCompleteMessage();
 | 
			
		||||
                        return true;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            /// <summary>
 | 
			
		||||
            /// Initialise asset transfer from the client
 | 
			
		||||
            /// </summary>
 | 
			
		||||
            /// <param name="xferID"></param>
 | 
			
		||||
            /// <param name="packetID"></param>
 | 
			
		||||
            /// <param name="data"></param>
 | 
			
		||||
            /// <returns>True if the transfer is complete, false otherwise</returns>            
 | 
			
		||||
            public bool Initialise(IClientAPI remoteClient, LLUUID assetID, LLUUID transaction, sbyte type, byte[] data,
 | 
			
		||||
                                   bool storeLocal, bool tempFile)
 | 
			
		||||
            {
 | 
			
		||||
                ourClient = remoteClient;
 | 
			
		||||
                Asset = new AssetBase();
 | 
			
		||||
                Asset.FullID = assetID;
 | 
			
		||||
                Asset.InvType = type;
 | 
			
		||||
                Asset.Type = type;
 | 
			
		||||
                Asset.Data = data;
 | 
			
		||||
                Asset.Name = "blank";
 | 
			
		||||
                Asset.Description = "empty";
 | 
			
		||||
                Asset.Local = storeLocal;
 | 
			
		||||
                Asset.Temporary = tempFile;
 | 
			
		||||
 | 
			
		||||
                TransactionID = transaction;
 | 
			
		||||
                m_storeLocal = storeLocal;
 | 
			
		||||
                if (Asset.Data.Length > 2)
 | 
			
		||||
                {
 | 
			
		||||
                    SendCompleteMessage();
 | 
			
		||||
                    return true;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    RequestStartXfer();
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            protected void RequestStartXfer()
 | 
			
		||||
            {
 | 
			
		||||
                UploadComplete = false;
 | 
			
		||||
                XferID = Util.GetNextXferID();
 | 
			
		||||
                RequestXferPacket newPack = new RequestXferPacket();
 | 
			
		||||
                newPack.XferID.ID = XferID;
 | 
			
		||||
                newPack.XferID.VFileType = Asset.Type;
 | 
			
		||||
                newPack.XferID.VFileID = Asset.FullID;
 | 
			
		||||
                newPack.XferID.FilePath = 0;
 | 
			
		||||
                newPack.XferID.Filename = new byte[0];
 | 
			
		||||
                ourClient.OutPacket(newPack, ThrottleOutPacketType.Asset);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            protected void SendCompleteMessage()
 | 
			
		||||
            {
 | 
			
		||||
                UploadComplete = true;
 | 
			
		||||
                AssetUploadCompletePacket newPack = new AssetUploadCompletePacket();
 | 
			
		||||
                newPack.AssetBlock.Type = Asset.Type;
 | 
			
		||||
                newPack.AssetBlock.Success = true;
 | 
			
		||||
                newPack.AssetBlock.UUID = Asset.FullID;
 | 
			
		||||
                ourClient.OutPacket(newPack, ThrottleOutPacketType.Asset);
 | 
			
		||||
                m_finished = true;
 | 
			
		||||
                if (m_createItem)
 | 
			
		||||
                {
 | 
			
		||||
                    DoCreateItem();
 | 
			
		||||
                }
 | 
			
		||||
                else if (m_storeLocal)
 | 
			
		||||
                {
 | 
			
		||||
                    m_userTransactions.Manager.MyScene.CommsManager.AssetCache.AddAsset(Asset);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Console.WriteLine("upload complete "+ this.TransactionID);
 | 
			
		||||
 | 
			
		||||
                if (m_dumpAssetToFile)
 | 
			
		||||
                {
 | 
			
		||||
                    DateTime now = DateTime.Now;
 | 
			
		||||
                    string filename =
 | 
			
		||||
                        String.Format("{6}_{7}_{0:d2}{1:d2}{2:d2}_{3:d2}{4:d2}{5:d2}.dat", now.Year, now.Month, now.Day,
 | 
			
		||||
                                      now.Hour, now.Minute, now.Second, Asset.Name, Asset.Type);
 | 
			
		||||
                    SaveAssetToFile(filename, Asset.Data);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            ///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";
 | 
			
		||||
                if (!Directory.Exists(assetPath))
 | 
			
		||||
                {
 | 
			
		||||
                    Directory.CreateDirectory(assetPath);
 | 
			
		||||
                }
 | 
			
		||||
                FileStream fs = File.Create(Path.Combine(assetPath, filename));
 | 
			
		||||
                BinaryWriter bw = new BinaryWriter(fs);
 | 
			
		||||
                bw.Write(data);
 | 
			
		||||
                bw.Close();
 | 
			
		||||
                fs.Close();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            public void RequestCreateInventoryItem(IClientAPI remoteClient, LLUUID transactionID, LLUUID folderID,
 | 
			
		||||
                                                   uint callbackID, string description, string name, sbyte invType,
 | 
			
		||||
                                                   sbyte type, byte wearableType, uint nextOwnerMask)
 | 
			
		||||
            {
 | 
			
		||||
                if (TransactionID == transactionID)
 | 
			
		||||
                {
 | 
			
		||||
                    InventFolder = folderID;
 | 
			
		||||
                    m_name = name;
 | 
			
		||||
                    m_description = description;
 | 
			
		||||
                    this.type = type;
 | 
			
		||||
                    this.invType = invType;
 | 
			
		||||
                    nextPerm = nextOwnerMask;
 | 
			
		||||
                    Asset.Name = name;
 | 
			
		||||
                    Asset.Description = description;
 | 
			
		||||
                    Asset.Type = type;
 | 
			
		||||
                    Asset.InvType = invType;
 | 
			
		||||
                    m_createItem = true;
 | 
			
		||||
                    if (m_finished)
 | 
			
		||||
                    {
 | 
			
		||||
                        DoCreateItem();
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
                      
 | 
			
		||||
            public void RequestUpdateInventoryItem(IClientAPI remoteClient, LLUUID transactionID, 
 | 
			
		||||
                                                   InventoryItemBase item)
 | 
			
		||||
            {
 | 
			
		||||
                if (TransactionID == transactionID)
 | 
			
		||||
                {            
 | 
			
		||||
                    CachedUserInfo userInfo =
 | 
			
		||||
                        m_userTransactions.Manager.MyScene.CommsManager.UserProfileCacheService.GetUserDetails(
 | 
			
		||||
                            remoteClient.AgentId);
 | 
			
		||||
                    
 | 
			
		||||
                    if (userInfo != null)
 | 
			
		||||
                    {                    
 | 
			
		||||
                        LLUUID assetID = LLUUID.Combine(transactionID, remoteClient.SecureSessionId);
 | 
			
		||||
                        
 | 
			
		||||
                        AssetBase asset
 | 
			
		||||
                            = m_userTransactions.Manager.MyScene.CommsManager.AssetCache.GetAsset(
 | 
			
		||||
                                assetID, (item.assetType == (int) AssetType.Texture ? true : false));
 | 
			
		||||
                        
 | 
			
		||||
                        if (asset == null)
 | 
			
		||||
                        {
 | 
			
		||||
                            asset = m_userTransactions.GetTransactionAsset(transactionID);
 | 
			
		||||
                        }                    
 | 
			
		||||
 | 
			
		||||
                        if (asset != null && 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;
 | 
			
		||||
 | 
			
		||||
                            m_userTransactions.Manager.MyScene.CommsManager.AssetCache.AddAsset(Asset);
 | 
			
		||||
                        }      
 | 
			
		||||
                        
 | 
			
		||||
                        userInfo.UpdateItem(remoteClient.AgentId, item);                    
 | 
			
		||||
                    }     
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            private void DoCreateItem()
 | 
			
		||||
            {
 | 
			
		||||
                //really need to fix this call, if lbsa71 saw this he would die. 
 | 
			
		||||
                m_userTransactions.Manager.MyScene.CommsManager.AssetCache.AddAsset(Asset);
 | 
			
		||||
                CachedUserInfo userInfo =
 | 
			
		||||
                    m_userTransactions.Manager.MyScene.CommsManager.UserProfileCacheService.GetUserDetails(ourClient.AgentId);
 | 
			
		||||
                if (userInfo != null)
 | 
			
		||||
                {
 | 
			
		||||
                    InventoryItemBase item = new InventoryItemBase();
 | 
			
		||||
                    item.avatarID = ourClient.AgentId;
 | 
			
		||||
                    item.creatorsID = ourClient.AgentId;
 | 
			
		||||
                    item.inventoryID = LLUUID.Random();
 | 
			
		||||
                    item.assetID = Asset.FullID;
 | 
			
		||||
                    item.inventoryDescription = m_description;
 | 
			
		||||
                    item.inventoryName = m_name;
 | 
			
		||||
                    item.assetType = type;
 | 
			
		||||
                    item.invType = invType;
 | 
			
		||||
                    item.parentFolderID = InventFolder;
 | 
			
		||||
                    item.inventoryBasePermissions = 2147483647;
 | 
			
		||||
                    item.inventoryCurrentPermissions = 2147483647;
 | 
			
		||||
                    item.inventoryNextPermissions = nextPerm;
 | 
			
		||||
 | 
			
		||||
                    userInfo.AddItem(ourClient.AgentId, item);
 | 
			
		||||
                    ourClient.SendInventoryItemCreateUpdate(item);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            public AssetBase GetAssetData()
 | 
			
		||||
            {
 | 
			
		||||
                if (m_finished)
 | 
			
		||||
                {
 | 
			
		||||
                    return Asset;
 | 
			
		||||
                }
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -150,7 +150,7 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
        {
 | 
			
		||||
            lock (m_syncRoot)
 | 
			
		||||
            {
 | 
			
		||||
                return _PhyScene.Simulate((float) elapsed);
 | 
			
		||||
                return _PhyScene.Simulate((float)elapsed);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -175,7 +175,7 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
            foreach (SceneObjectPart part in sceneObject.Children.Values)
 | 
			
		||||
            {
 | 
			
		||||
                part.LocalID = m_parentScene.PrimIDAllocate();
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            sceneObject.UpdateParentIDs();
 | 
			
		||||
            AddEntity(sceneObject);
 | 
			
		||||
| 
						 | 
				
			
			@ -222,9 +222,9 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
            {
 | 
			
		||||
                if (obj is SceneObjectGroup)
 | 
			
		||||
                {
 | 
			
		||||
                    if (((SceneObjectGroup) obj).LocalId == localID)
 | 
			
		||||
                    if (((SceneObjectGroup)obj).LocalId == localID)
 | 
			
		||||
                    {
 | 
			
		||||
                        m_parentScene.RemoveEntity((SceneObjectGroup) obj);
 | 
			
		||||
                        m_parentScene.RemoveEntity((SceneObjectGroup)obj);
 | 
			
		||||
                        m_numPrim--;
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -237,7 +237,8 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
            System.Console.WriteLine("Attaching object " + objectLocalID + " to " + AttachmentPt);
 | 
			
		||||
            SceneObjectPart p = GetSceneObjectPart(objectLocalID);
 | 
			
		||||
            ScenePresence av = null;
 | 
			
		||||
            if (TryGetAvatar(remoteClient.AgentId, out av)) {
 | 
			
		||||
            if (TryGetAvatar(remoteClient.AgentId, out av))
 | 
			
		||||
            {
 | 
			
		||||
                ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
 | 
			
		||||
                objupdate.RegionData.RegionHandle = m_regInfo.RegionHandle;
 | 
			
		||||
                objupdate.RegionData.TimeDilation = ushort.MaxValue;
 | 
			
		||||
| 
						 | 
				
			
			@ -287,7 +288,7 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
                objupdate.ObjectData[0].NameValue =
 | 
			
		||||
                       Helpers.StringToField("FirstName STRING RW SV " + av.Firstname + "\nLastName STRING RW SV " + av.Lastname);
 | 
			
		||||
                LLVector3 pos2 = av.AbsolutePosition;
 | 
			
		||||
                       // new LLVector3((float) Pos.X, (float) Pos.Y, (float) Pos.Z);
 | 
			
		||||
                // new LLVector3((float) Pos.X, (float) Pos.Y, (float) Pos.Z);
 | 
			
		||||
                byte[] pb = pos2.GetBytes();
 | 
			
		||||
                Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -318,7 +319,7 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
 | 
			
		||||
                objupdate.ObjectData[1].TextureEntry = primData.TextureEntry;
 | 
			
		||||
                objupdate.ObjectData[1].PCode = primData.PCode;
 | 
			
		||||
                objupdate.ObjectData[1].State = (byte)(((byte)AttachmentPt) << 4) ;
 | 
			
		||||
                objupdate.ObjectData[1].State = (byte)(((byte)AttachmentPt) << 4);
 | 
			
		||||
                objupdate.ObjectData[1].PathBegin = primData.PathBegin;
 | 
			
		||||
                objupdate.ObjectData[1].PathEnd = primData.PathEnd;
 | 
			
		||||
                objupdate.ObjectData[1].PathScaleX = primData.PathScaleX;
 | 
			
		||||
| 
						 | 
				
			
			@ -356,7 +357,7 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
                objupdate.ObjectData[1].Radius = 20;
 | 
			
		||||
                objupdate.ObjectData[1].NameValue =
 | 
			
		||||
                       Helpers.StringToField("AttachItemID STRING RW SV " + p.UUID);
 | 
			
		||||
                LLVector3 pos = new LLVector3((float) 0.0, (float) 0.0, (float) 0.0);
 | 
			
		||||
                LLVector3 pos = new LLVector3((float)0.0, (float)0.0, (float)0.0);
 | 
			
		||||
 | 
			
		||||
                pb = pos.GetBytes();
 | 
			
		||||
                Array.Copy(pb, 0, objupdate.ObjectData[1].ObjectData, 0, pb.Length);
 | 
			
		||||
| 
						 | 
				
			
			@ -364,13 +365,7 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
                byte[] brot = rot.GetBytes();
 | 
			
		||||
                Array.Copy(brot, 0, objupdate.ObjectData[1].ObjectData, 36, brot.Length);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            remoteClient.OutPacket(objupdate, ThrottleOutPacketType.Task);
 | 
			
		||||
 | 
			
		||||
                
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
                remoteClient.OutPacket(objupdate, ThrottleOutPacketType.Task);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -466,8 +461,8 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
        {
 | 
			
		||||
            // some network situations come in where child agents get closed twice.
 | 
			
		||||
            if (m_numChildAgents < 0)
 | 
			
		||||
            { 
 | 
			
		||||
                m_numChildAgents = 0; 
 | 
			
		||||
            {
 | 
			
		||||
                m_numChildAgents = 0;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return m_numChildAgents;
 | 
			
		||||
| 
						 | 
				
			
			@ -569,8 +564,8 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
            {
 | 
			
		||||
                if (ent is SceneObjectGroup)
 | 
			
		||||
                {
 | 
			
		||||
                    if (((SceneObjectGroup) ent).HasChildPrim(localID))
 | 
			
		||||
                        return (SceneObjectGroup) ent;
 | 
			
		||||
                    if (((SceneObjectGroup)ent).HasChildPrim(localID))
 | 
			
		||||
                        return (SceneObjectGroup)ent;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return null;
 | 
			
		||||
| 
						 | 
				
			
			@ -584,8 +579,8 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
            {
 | 
			
		||||
                if (ent is SceneObjectGroup)
 | 
			
		||||
                {
 | 
			
		||||
                    if (((SceneObjectGroup) ent).HasChildPrim(fullID))
 | 
			
		||||
                        return (SceneObjectGroup) ent;
 | 
			
		||||
                    if (((SceneObjectGroup)ent).HasChildPrim(fullID))
 | 
			
		||||
                        return (SceneObjectGroup)ent;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return null;
 | 
			
		||||
| 
						 | 
				
			
			@ -600,7 +595,7 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
            {
 | 
			
		||||
                if (ent is SceneObjectGroup)
 | 
			
		||||
                {
 | 
			
		||||
                    SceneObjectGroup reportingG = (SceneObjectGroup) ent;
 | 
			
		||||
                    SceneObjectGroup reportingG = (SceneObjectGroup)ent;
 | 
			
		||||
                    EntityIntersection result = reportingG.TestIntersection(hray);
 | 
			
		||||
                    if (result.HitTF)
 | 
			
		||||
                    {
 | 
			
		||||
| 
						 | 
				
			
			@ -613,7 +608,7 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return returnResult;
 | 
			
		||||
        }      
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public SceneObjectPart GetSceneObjectPart(uint localID)
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -719,7 +714,7 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
                    if (presence.IsChildAgent && m_parentScene.m_seeIntoRegionFromNeighbor)
 | 
			
		||||
                    {
 | 
			
		||||
                        LLVector3 oLoc = ((SceneObjectGroup)ent).AbsolutePosition;
 | 
			
		||||
                        float distResult = (float)Util.GetDistanceTo(presence.AbsolutePosition,oLoc);
 | 
			
		||||
                        float distResult = (float)Util.GetDistanceTo(presence.AbsolutePosition, oLoc);
 | 
			
		||||
 | 
			
		||||
                        //m_log.Info("[DISTANCE]: " + distResult.ToString());
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -727,13 +722,13 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
                        {
 | 
			
		||||
                            // Send Only if we don't already know about it.
 | 
			
		||||
                            // KnownPrim also makes the prim known when called.
 | 
			
		||||
                            if (!presence.KnownPrim(((SceneObjectGroup) ent).UUID))
 | 
			
		||||
                                ((SceneObjectGroup) ent).ScheduleFullUpdateToAvatar(presence);
 | 
			
		||||
                            if (!presence.KnownPrim(((SceneObjectGroup)ent).UUID))
 | 
			
		||||
                                ((SceneObjectGroup)ent).ScheduleFullUpdateToAvatar(presence);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        ((SceneObjectGroup) ent).ScheduleFullUpdateToAvatar(presence);
 | 
			
		||||
                        ((SceneObjectGroup)ent).ScheduleFullUpdateToAvatar(presence);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -903,7 +898,7 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
            {
 | 
			
		||||
                if (PermissionsMngr.CanEditObject(remoteClient.AgentId, group.UUID))
 | 
			
		||||
                {
 | 
			
		||||
                    group.UpdatePrimFlags(localID, (ushort) packet.Type, true, packet.ToBytes());
 | 
			
		||||
                    group.UpdatePrimFlags(localID, (ushort)packet.Type, true, packet.ToBytes());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -1003,9 +998,9 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
            {
 | 
			
		||||
                if (ent is SceneObjectGroup)
 | 
			
		||||
                {
 | 
			
		||||
                    if (((SceneObjectGroup) ent).LocalId == parentPrim)
 | 
			
		||||
                    if (((SceneObjectGroup)ent).LocalId == parentPrim)
 | 
			
		||||
                    {
 | 
			
		||||
                        parenPrim = (SceneObjectGroup) ent;
 | 
			
		||||
                        parenPrim = (SceneObjectGroup)ent;
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -1020,9 +1015,9 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
                    {
 | 
			
		||||
                        if (ent is SceneObjectGroup)
 | 
			
		||||
                        {
 | 
			
		||||
                            if (((SceneObjectGroup) ent).LocalId == childPrims[i])
 | 
			
		||||
                            if (((SceneObjectGroup)ent).LocalId == childPrims[i])
 | 
			
		||||
                            {
 | 
			
		||||
                                children.Add((SceneObjectGroup) ent);
 | 
			
		||||
                                children.Add((SceneObjectGroup)ent);
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1049,25 +1044,25 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
            // be more efficient yet to keep this dictionary permanently on hand.
 | 
			
		||||
 | 
			
		||||
            Dictionary<uint, SceneObjectGroup> sceneObjects = new Dictionary<uint, SceneObjectGroup>();
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
            List<EntityBase> EntitieList = GetEntities();
 | 
			
		||||
            foreach (EntityBase ent in EntitieList)
 | 
			
		||||
            {
 | 
			
		||||
                if (ent is SceneObjectGroup)
 | 
			
		||||
                {
 | 
			
		||||
                    SceneObjectGroup obj = (SceneObjectGroup) ent;
 | 
			
		||||
                    SceneObjectGroup obj = (SceneObjectGroup)ent;
 | 
			
		||||
                    sceneObjects.Add(obj.LocalId, obj);
 | 
			
		||||
                    
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Find the root prim among the prim ids we've been given
 | 
			
		||||
            for (int i = 0; i < primIds.Count; i++)
 | 
			
		||||
            {
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
                if (sceneObjects.ContainsKey(primIds[i]))
 | 
			
		||||
                {
 | 
			
		||||
                    
 | 
			
		||||
 | 
			
		||||
                    parenPrim = sceneObjects[primIds[i]];
 | 
			
		||||
                    primIds.RemoveAt(i);
 | 
			
		||||
                    break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1124,9 +1119,9 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
            {
 | 
			
		||||
                if (ent is SceneObjectGroup)
 | 
			
		||||
                {
 | 
			
		||||
                    if (((SceneObjectGroup) ent).LocalId == originalPrim)
 | 
			
		||||
                    if (((SceneObjectGroup)ent).LocalId == originalPrim)
 | 
			
		||||
                    {
 | 
			
		||||
                        originPrim = (SceneObjectGroup) ent;
 | 
			
		||||
                        originPrim = (SceneObjectGroup)ent;
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -1139,14 +1134,14 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
                    SceneObjectGroup copy = originPrim.Copy(AgentID, GroupID);
 | 
			
		||||
                    copy.AbsolutePosition = copy.AbsolutePosition + offset;
 | 
			
		||||
                    copy.ResetIDs();
 | 
			
		||||
                    
 | 
			
		||||
 | 
			
		||||
                    lock (Entities)
 | 
			
		||||
                    {
 | 
			
		||||
                        Entities.Add(copy.UUID, copy);
 | 
			
		||||
                    }
 | 
			
		||||
                    
 | 
			
		||||
 | 
			
		||||
                    m_numPrim++;
 | 
			
		||||
                    
 | 
			
		||||
 | 
			
		||||
                    copy.StartScripts();
 | 
			
		||||
                    copy.ScheduleGroupForFullUpdate();
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -1170,7 +1165,7 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
 | 
			
		||||
            return
 | 
			
		||||
                (float)
 | 
			
		||||
                Math.Sqrt((v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y) + (v1.z - v2.z)*(v1.z - v2.z));
 | 
			
		||||
                Math.Sqrt((v1.x - v2.x) * (v1.x - v2.x) + (v1.y - v2.y) * (v1.y - v2.y) + (v1.z - v2.z) * (v1.z - v2.z));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #endregion
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,6 +36,7 @@ using OpenSim.Framework.Console;
 | 
			
		|||
using System.IO;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Xml;
 | 
			
		||||
using OpenSim.Region.Environment.Interfaces;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace OpenSim.Region.Environment.Scenes
 | 
			
		||||
| 
						 | 
				
			
			@ -266,8 +267,12 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        CommsManager.TransactionsManager.HandleItemUpdateFromTransaction(
 | 
			
		||||
                             remoteClient, transactionID, item);                        
 | 
			
		||||
                        IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>();
 | 
			
		||||
                        if (agentTransactions != null)
 | 
			
		||||
                        {
 | 
			
		||||
                            agentTransactions.HandleItemUpdateFromTransaction(
 | 
			
		||||
                                         remoteClient, transactionID, item);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
| 
						 | 
				
			
			@ -459,9 +464,15 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                CommsManager.TransactionsManager.HandleItemCreationFromTransaction(
 | 
			
		||||
                IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>();
 | 
			
		||||
                if (agentTransactions != null)
 | 
			
		||||
                {
 | 
			
		||||
                    agentTransactions.HandleItemCreationFromTransaction(
 | 
			
		||||
                    remoteClient, transactionID, folderID, callbackID, description,
 | 
			
		||||
                    name, invType, assetType, wearableType, nextOwnerMask);                    
 | 
			
		||||
                    name, invType, assetType, wearableType, nextOwnerMask); 
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                                
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1397,8 +1397,8 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
            client.OnUpdateInventoryItem += UpdateInventoryItemAsset;
 | 
			
		||||
            client.OnCopyInventoryItem += CopyInventoryItem;
 | 
			
		||||
            client.OnMoveInventoryItem += MoveInventoryItem;
 | 
			
		||||
            client.OnAssetUploadRequest += CommsManager.TransactionsManager.HandleUDPUploadRequest;
 | 
			
		||||
            client.OnXferReceive += CommsManager.TransactionsManager.HandleXfer;
 | 
			
		||||
           // client.OnAssetUploadRequest += CommsManager.TransactionsManager.HandleUDPUploadRequest;
 | 
			
		||||
          //  client.OnXferReceive += CommsManager.TransactionsManager.HandleXfer;
 | 
			
		||||
            client.OnRezScript += RezScript;
 | 
			
		||||
 | 
			
		||||
            client.OnRequestTaskInventory += RequestTaskInventory;
 | 
			
		||||
| 
						 | 
				
			
			@ -1489,8 +1489,12 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
 | 
			
		||||
            ForEachScenePresence(
 | 
			
		||||
                delegate(ScenePresence presence) { presence.CoarseLocationChange(); });
 | 
			
		||||
            
 | 
			
		||||
            CommsManager.TransactionsManager.RemoveAgentAssetTransactions(agentID);
 | 
			
		||||
           
 | 
			
		||||
            IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>();
 | 
			
		||||
            if (agentTransactions != null)
 | 
			
		||||
            {
 | 
			
		||||
                agentTransactions.RemoveAgentAssetTransactions(agentID);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            lock (m_scenePresences)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1618,8 +1618,7 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
                SendFullUpdateToAllClients();
 | 
			
		||||
 | 
			
		||||
                SendObjectPropertiesToClient(AgentID);
 | 
			
		||||
                
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue