From 0be9ff19490149509dec72898be3f9dfe84612af Mon Sep 17 00:00:00 2001 From: MW Date: Mon, 24 Nov 2008 10:03:18 +0000 Subject: Some refactoring from about a week ago that I forgot to commit, of AssetTransactionModule to cut down on number of classes and to work towards having a base AssetXferUploader class than can be shared with EstateTerrainXferHandler --- .../AssetTransaction/AssetTransactionModule.cs | 219 +++++++++++++++++---- 1 file changed, 180 insertions(+), 39 deletions(-) (limited to 'OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetTransactionModule.cs') diff --git a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetTransactionModule.cs b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetTransactionModule.cs index 19d7066..d98d07d 100644 --- a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetTransactionModule.cs +++ b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetTransactionModule.cs @@ -42,48 +42,23 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction private bool m_dumpAssetsToFile = false; private Scene m_scene = null; - private AgentAssetTransactionsManager m_transactionManager; - - - public AssetTransactionModule() - { - // System.Console.WriteLine("creating AgentAssetTransactionModule"); - } - - #region IAgentAssetTransactions Members - - public void HandleItemCreationFromTransaction(IClientAPI remoteClient, UUID transactionID, UUID folderID, - uint callbackID, string description, string name, sbyte invType, - sbyte type, byte wearableType, uint nextOwnerMask) + public Scene MyScene { - m_transactionManager.HandleItemCreationFromTransaction(remoteClient, transactionID, folderID, callbackID, description, name, invType, type, - wearableType, nextOwnerMask); + get{ return m_scene;} } - public void HandleItemUpdateFromTransaction(IClientAPI remoteClient, UUID transactionID, InventoryItemBase item) - { - m_transactionManager.HandleItemUpdateFromTransaction(remoteClient, transactionID, item); - } + /// + /// Each agent has its own singleton collection of transactions + /// + private Dictionary AgentTransactions = + new Dictionary(); - public void HandleTaskItemUpdateFromTransaction( - IClientAPI remoteClient, SceneObjectPart part, UUID transactionID, TaskInventoryItem item) - { - m_transactionManager.HandleTaskItemUpdateFromTransaction(remoteClient, part, transactionID, item); - } - - public void RequestXferFromClient(IClientAPI remoteClient, UUID assetID, UUID transaction, sbyte type, - byte[] data, bool storeLocal, bool tempFile) - { - m_transactionManager.HandleUDPUploadRequest(remoteClient, assetID, transaction, type, data, storeLocal, tempFile); - } - public void RemoveAgentAssetTransactions(UUID userID) + public AssetTransactionModule() { - m_transactionManager.RemoveAgentAssetTransactions(userID); + // System.Console.WriteLine("creating AgentAssetTransactionModule"); } - #endregion - #region IRegionModule Members public void Initialise(Scene scene, IConfigSource config) @@ -105,16 +80,13 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction try { m_dumpAssetsToFile = config.Configs["StandAlone"].GetBoolean("dump_assets_to_file", false); - m_transactionManager = new AgentAssetTransactionsManager(m_scene, m_dumpAssetsToFile); } catch (Exception) { - m_transactionManager = new AgentAssetTransactionsManager(m_scene, false); } } else { - m_transactionManager = new AgentAssetTransactionsManager(m_scene, false); } } } @@ -141,8 +113,177 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction public void NewClient(IClientAPI client) { - client.OnAssetUploadRequest += m_transactionManager.HandleUDPUploadRequest; - client.OnXferReceive += m_transactionManager.HandleXfer; + client.OnAssetUploadRequest += HandleUDPUploadRequest; + client.OnXferReceive += HandleXfer; + } + + #region AgentAssetTransactions + /// + /// Get the collection of asset transactions for the given user. If one does not already exist, it + /// is created. + /// + /// + /// + private AgentAssetTransactions GetUserTransactions(UUID userID) + { + lock (AgentTransactions) + { + if (!AgentTransactions.ContainsKey(userID)) + { + AgentAssetTransactions transactions = new AgentAssetTransactions(userID, this, m_dumpAssetsToFile); + AgentTransactions.Add(userID, transactions); + } + + return AgentTransactions[userID]; + } + } + + /// + /// 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). + /// + /// + public void RemoveAgentAssetTransactions(UUID userID) + { + // m_log.DebugFormat("Removing agent asset transactions structure for agent {0}", userID); + + lock (AgentTransactions) + { + AgentTransactions.Remove(userID); + } + } + + /// + /// 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. + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public void HandleItemCreationFromTransaction(IClientAPI remoteClient, UUID transactionID, UUID 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); } + + /// + /// 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. + /// + /// + /// + /// + public void HandleItemUpdateFromTransaction(IClientAPI remoteClient, UUID transactionID, + InventoryItemBase item) + { + // m_log.DebugFormat( + // "[TRANSACTIONS MANAGER] Called HandleItemUpdateFromTransaction with item {0}", + // item.Name); + + AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId); + + transactions.RequestUpdateInventoryItem(remoteClient, transactionID, item); + } + + /// + /// 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. + /// + /// + /// + /// + 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); + } + + /// + /// Request that a client (agent) begin an asset transfer. + /// + /// + /// + /// + /// + /// + /// + public void HandleUDPUploadRequest(IClientAPI remoteClient, UUID assetID, UUID transaction, sbyte type, + byte[] data, bool storeLocal, bool tempFile) + { + //System.Console.WriteLine("HandleUDPUploadRequest - assetID: " + assetID.ToString() + " transaction: " + transaction.ToString() + " type: " + type.ToString() + " storelocal: " + storeLocal + " tempFile: " + tempFile); + if (((AssetType)type == AssetType.Texture || + (AssetType)type == AssetType.Sound || + (AssetType)type == AssetType.TextureTGA || + (AssetType)type == AssetType.Animation) && + tempFile == false) + { + Scene scene = (Scene)remoteClient.Scene; + IMoneyModule mm = scene.RequestModuleInterface(); + + if (mm != null) + { + if (!mm.UploadCovered(remoteClient)) + { + remoteClient.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false); + return; + } + } + } + + //Console.WriteLine("asset upload of " + assetID); + AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId); + + AssetXferUploader uploader = transactions.RequestXferUploader(transaction); + if (uploader != null) + { + uploader.Initialise(remoteClient, assetID, transaction, type, data, storeLocal, tempFile); + } + } + + /// + /// Handle asset transfer data packets received in response to the asset upload request in + /// HandleUDPUploadRequest() + /// + /// + /// + /// + /// + public void HandleXfer(IClientAPI remoteClient, ulong xferID, uint packetID, byte[] data) + { + //System.Console.WriteLine("xferID: " + xferID + " packetID: " + packetID + " data!"); + AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId); + + transactions.HandleXfer(xferID, packetID, data); + } + + #endregion } } -- cgit v1.1