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 --- .../AgentAssetTransactionsManager.cs | 6 +- .../AssetTransaction/AgentAssetsTransactions.cs | 132 +++++++++++-- .../AssetTransaction/AssetTransactionModule.cs | 219 +++++++++++++++++---- .../Agent/AssetTransaction/AssetXferUploader.cs | 68 +------ 4 files changed, 299 insertions(+), 126 deletions(-) (limited to 'OpenSim/Region/Environment/Modules/Agent') diff --git a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetTransactionsManager.cs b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetTransactionsManager.cs index 010fcf7..f9f44f0 100644 --- a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetTransactionsManager.cs +++ b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetTransactionsManager.cs @@ -35,6 +35,7 @@ using OpenSim.Region.Interfaces; namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction { + /* public class AgentAssetTransactionsManager { //private static readonly ILog m_log @@ -71,8 +72,8 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction { if (!AgentTransactions.ContainsKey(userID)) { - AgentAssetTransactions transactions - = new AgentAssetTransactions(userID, this, m_dumpAssetsToFile); + AgentAssetTransactions transactions = null; + //= new AgentAssetTransactions(userID, this, m_dumpAssetsToFile); AgentTransactions.Add(userID, transactions); } @@ -226,4 +227,5 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction transactions.HandleXfer(xferID, packetID, data); } } + */ } diff --git a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetsTransactions.cs index 2a91624..689b4d5 100644 --- a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetsTransactions.cs +++ b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetsTransactions.cs @@ -30,6 +30,7 @@ using System.Collections.Generic; using OpenMetaverse; using OpenSim.Framework; using OpenSim.Region.Environment.Scenes; +using OpenSim.Framework.Communications.Cache; namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction { @@ -38,17 +39,16 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction /// public class AgentAssetTransactions { - //private static readonly log4net.ILog m_log - // = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); // Fields private bool m_dumpAssetsToFile; - public AgentAssetTransactionsManager Manager; + public AssetTransactionModule Manager; public UUID UserID; public Dictionary XferUploaders = new Dictionary(); // Methods - public AgentAssetTransactions(UUID agentID, AgentAssetTransactionsManager manager, bool dumpAssetsToFile) + public AgentAssetTransactions(UUID agentID, AssetTransactionModule manager, bool dumpAssetsToFile) { UserID = agentID; Manager = manager; @@ -97,24 +97,8 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction wearableType, nextOwnerMask); } } - - public void RequestUpdateInventoryItem(IClientAPI remoteClient, UUID transactionID, - InventoryItemBase item) - { - if (XferUploaders.ContainsKey(transactionID)) - { - 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); - } - } + /// /// Get an uploaded asset. If the data is successfully retrieved, the transaction will be removed. @@ -138,5 +122,111 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction return null; } + + //private void CreateItemFromUpload(AssetBase asset, IClientAPI ourClient, UUID inventoryFolderID, uint nextPerms, uint wearableType) + //{ + // Manager.MyScene.CommsManager.AssetCache.AddAsset(asset); + // CachedUserInfo userInfo = Manager.MyScene.CommsManager.UserProfileCacheService.GetUserDetails( + // ourClient.AgentId); + + // if (userInfo != null) + // { + // InventoryItemBase item = new InventoryItemBase(); + // item.Owner = ourClient.AgentId; + // item.Creator = ourClient.AgentId; + // item.ID = UUID.Random(); + // item.AssetID = asset.FullID; + // item.Description = asset.Description; + // item.Name = asset.Name; + // item.AssetType = asset.Type; + // item.InvType = asset.Type; + // item.Folder = inventoryFolderID; + // item.BasePermissions = 0x7fffffff; + // item.CurrentPermissions = 0x7fffffff; + // item.EveryOnePermissions = 0; + // item.NextPermissions = nextPerms; + // item.Flags = wearableType; + // item.CreationDate = Util.UnixTimeSinceEpoch(); + + // userInfo.AddItem(item); + // ourClient.SendInventoryItemCreateUpdate(item); + // } + // else + // { + // m_log.ErrorFormat( + // "[ASSET TRANSACTIONS]: Could not find user {0} for inventory item creation", + // ourClient.AgentId); + // } + //} + + public void RequestUpdateTaskInventoryItem( + IClientAPI remoteClient, SceneObjectPart part, UUID transactionID, TaskInventoryItem item) + { + if (XferUploaders.ContainsKey(transactionID)) + { + AssetBase asset = XferUploaders[transactionID].GetAssetData(); + if (asset != null) + { + 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; + + Manager.MyScene.CommsManager.AssetCache.AddAsset(asset); + + if (part.Inventory.UpdateInventoryItem(item)) + part.GetProperties(remoteClient); + } + } + } + + + public void RequestUpdateInventoryItem(IClientAPI remoteClient, UUID transactionID, + InventoryItemBase item) + { + if (XferUploaders.ContainsKey(transactionID)) + { + CachedUserInfo userInfo = Manager.MyScene.CommsManager.UserProfileCacheService.GetUserDetails( + remoteClient.AgentId); + + if (userInfo != null) + { + UUID assetID = UUID.Combine(transactionID, remoteClient.SecureSessionId); + + AssetBase asset + = Manager.MyScene.CommsManager.AssetCache.GetAsset( + assetID, (item.AssetType == (int)AssetType.Texture ? true : false)); + + if (asset == null) + { + asset = GetTransactionAsset(transactionID); + } + + if (asset != null && asset.FullID == assetID) + { + // Assets never get updated, new ones get created + asset.FullID = UUID.Random(); + asset.Name = item.Name; + asset.Description = item.Description; + asset.Type = (sbyte)item.AssetType; + item.AssetID = asset.FullID; + + Manager.MyScene.CommsManager.AssetCache.AddAsset(asset); + } + + userInfo.UpdateItem(item); + } + else + { + m_log.ErrorFormat( + "[ASSET TRANSACTIONS]: Could not find user {0} for inventory item update", + remoteClient.AgentId); + } + } + } } } 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 } } diff --git a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetXferUploader.cs b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetXferUploader.cs index 3ef2e1f..6dcbe83 100644 --- a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetXferUploader.cs +++ b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetXferUploader.cs @@ -199,81 +199,21 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction m_asset.Name = name; m_asset.Description = description; m_asset.Type = type; - m_createItem = true; - + if (m_finished) { DoCreateItem(); } - } - } - - public void RequestUpdateInventoryItem(IClientAPI remoteClient, UUID transactionID, - InventoryItemBase item) - { - if (TransactionID == transactionID) - { - CachedUserInfo userInfo = - m_userTransactions.Manager.MyScene.CommsManager.UserProfileCacheService.GetUserDetails( - remoteClient.AgentId); - - if (userInfo != null) - { - UUID assetID = UUID.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) - { - // Assets never get updated, new ones get created - asset.FullID = UUID.Random(); - asset.Name = item.Name; - asset.Description = item.Description; - asset.Type = (sbyte) item.AssetType; - item.AssetID = asset.FullID; - - m_userTransactions.Manager.MyScene.CommsManager.AssetCache.AddAsset(m_asset); - } - - userInfo.UpdateItem(item); - } else { - m_log.ErrorFormat( - "[ASSET TRANSACTIONS]: Could not find user {0} for inventory item update", - remoteClient.AgentId); - } + m_createItem = true; //set flag so the inventory item is created when upload is complete + } } } - - 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); - - m_asset.Name = item.Name; - m_asset.Description = item.Description; - m_asset.Type = (sbyte) item.Type; - item.AssetID = m_asset.FullID; - - m_userTransactions.Manager.MyScene.CommsManager.AssetCache.AddAsset(m_asset); - - if (part.Inventory.UpdateInventoryItem(item)) - part.GetProperties(remoteClient); - } + private void DoCreateItem() { - //really need to fix this call, if lbsa71 saw this he would die. m_userTransactions.Manager.MyScene.CommsManager.AssetCache.AddAsset(m_asset); CachedUserInfo userInfo = m_userTransactions.Manager.MyScene.CommsManager.UserProfileCacheService.GetUserDetails( -- cgit v1.1