From 4db839c3b84bed8a775074beb1ae0b526bc05e81 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Wed, 23 Apr 2008 17:04:15 +0000 Subject: * Implement proper emptying of trashcan on standalone * On standalone, folders (and their items) should now be persistently deleted on trash emptying, as well as immediate child items * An implementation for grid mode will follow. --- .../Communications/Cache/InventoryFolderImpl.cs | 8 ++-- .../Cache/UserProfileCacheService.cs | 29 +++++++++++--- .../Framework/Communications/IInventoryServices.cs | 12 ++++++ .../Communications/InventoryServiceBase.cs | 45 +++++++++++++++++++++- OpenSim/Framework/IInventoryData.cs | 2 +- OpenSim/Framework/InventoryItemBase.cs | 2 - 6 files changed, 84 insertions(+), 14 deletions(-) (limited to 'OpenSim/Framework') diff --git a/OpenSim/Framework/Communications/Cache/InventoryFolderImpl.cs b/OpenSim/Framework/Communications/Cache/InventoryFolderImpl.cs index daf9ab5..7812499 100644 --- a/OpenSim/Framework/Communications/Cache/InventoryFolderImpl.cs +++ b/OpenSim/Framework/Communications/Cache/InventoryFolderImpl.cs @@ -79,14 +79,12 @@ namespace OpenSim.Framework.Communications.Cache /// /// Delete all the folders and items in this folder. - /// - /// TODO: This method is not used yet, but will be shortly /// - public void DeleteAllContents() + public void Purge() { foreach (InventoryFolderImpl folder in SubFolders.Values) { - folder.DeleteAllContents(); + folder.Purge(); } SubFolders.Clear(); @@ -206,7 +204,7 @@ namespace OpenSim.Framework.Communications.Cache } /// - /// Return the list of folders in this folder + /// Return the list of immediate child folders in this folder. /// public List RequestListOfFolders() { diff --git a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs index e3f6815..61ec483 100644 --- a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs +++ b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs @@ -496,6 +496,11 @@ namespace OpenSim.Framework.Communications.Cache return new List(); } + /// + /// This should delete all the items and folders in the given directory. + /// + /// + /// public void HandlePurgeInventoryDescendents(IClientAPI remoteClient, LLUUID folderID) { // m_log.InfoFormat("[AGENT INVENTORY]: Purging folder {0} for {1} uuid {2}", @@ -506,14 +511,28 @@ namespace OpenSim.Framework.Communications.Cache { if (userProfile.HasInventory) { - InventoryFolderImpl subFolder = userProfile.RootFolder.HasSubFolder(folderID); - if (subFolder != null) - { - List items = subFolder.RequestListOfItems(); + InventoryFolderImpl purgedFolder = userProfile.RootFolder.HasSubFolder(folderID); + if (purgedFolder != null) + { + // XXX Nasty - have to create a new object to hold details we already have + InventoryFolderBase purgedBaseFolder = new InventoryFolderBase(); + purgedBaseFolder.Owner = purgedFolder.Owner; + purgedBaseFolder.ID = purgedFolder.ID; + purgedBaseFolder.Name = purgedFolder.Name; + purgedBaseFolder.ParentID = purgedFolder.ParentID; + purgedBaseFolder.Type = purgedFolder.Type; + purgedBaseFolder.Version = purgedFolder.Version; + + m_commsManager.InventoryService.PurgeInventoryFolder(remoteClient.AgentId, purgedBaseFolder); + + // XXX Remains temporarily so that we still delete items in the grid case. + List items = purgedFolder.RequestListOfItems(); foreach (InventoryItemBase item in items) { userProfile.DeleteItem(remoteClient.AgentId, item); - } + } + + purgedFolder.Purge(); } } else diff --git a/OpenSim/Framework/Communications/IInventoryServices.cs b/OpenSim/Framework/Communications/IInventoryServices.cs index 90bda01..5690f89 100644 --- a/OpenSim/Framework/Communications/IInventoryServices.cs +++ b/OpenSim/Framework/Communications/IInventoryServices.cs @@ -56,9 +56,21 @@ namespace OpenSim.Framework.Communications /// void AddNewInventoryFolder(LLUUID userID, InventoryFolderBase folder); + /// + /// Move an inventory folder to a new location + /// + /// + /// A folder containing the details of the new location void MoveInventoryFolder(LLUUID userID, InventoryFolderBase folder); /// + /// Purge an inventory folder of all its items and subfolders. + /// + /// + /// + void PurgeInventoryFolder(LLUUID userID, InventoryFolderBase folder); + + /// /// Add a new item to the given user's inventory /// /// diff --git a/OpenSim/Framework/Communications/InventoryServiceBase.cs b/OpenSim/Framework/Communications/InventoryServiceBase.cs index f614e7d..769c530 100644 --- a/OpenSim/Framework/Communications/InventoryServiceBase.cs +++ b/OpenSim/Framework/Communications/InventoryServiceBase.cs @@ -50,7 +50,7 @@ namespace OpenSim.Framework.Communications { if (!String.IsNullOrEmpty(FileName)) { - m_log.Info("[AGENTINVENTORY]: Inventory storage: Attempting to load " + FileName); + m_log.Info("[AGENT INVENTORY]: Inventory storage: Attempting to load " + FileName); Assembly pluginAssembly = Assembly.LoadFrom(FileName); foreach (Type pluginType in pluginAssembly.GetTypes()) @@ -161,9 +161,19 @@ namespace OpenSim.Framework.Communications // See IInventoryServices public abstract void RequestInventoryForUser(LLUUID userID, InventoryReceiptCallback callback); + // See IInventoryServices public abstract void AddNewInventoryFolder(LLUUID userID, InventoryFolderBase folder); + + // See IInventoryServices public abstract void MoveExistingInventoryFolder(InventoryFolderBase folder); + + // See IInventoryServices + public abstract void PurgeInventoryFolder(LLUUID userID, InventoryFolderBase folder); + + // See IInventoryServices public abstract void AddNewInventoryItem(LLUUID userID, InventoryItemBase item); + + // See IInventoryServices public abstract void DeleteInventoryItem(LLUUID userID, InventoryItemBase item); #endregion @@ -228,6 +238,36 @@ namespace OpenSim.Framework.Communications } } + /// + /// Purge a folder of all items items and subfolders. + /// + /// FIXME: Really nasty in a sense, because we have to query the database to get information we may + /// already know... Needs heavy refactoring. + /// + /// + protected void PurgeFolder(InventoryFolderBase folder) + { + List subFolders = RequestSubFolders(folder.ID); + + foreach (InventoryFolderBase subFolder in subFolders) + { +// m_log.DebugFormat("[AGENT INVENTORY]: Deleting folder {0} {1}", subFolder.Name, subFolder.ID); + + foreach (KeyValuePair plugin in m_plugins) + { + plugin.Value.deleteInventoryFolder(subFolder.ID); + } + } + + // XXX Temporarily don't delete the items since UserProfileCacheService is still doing this +// List items = RequestFolderItems(folder.ID); +// +// foreach (InventoryItemBase item : items) +// { +// DeleteItem(item); +// } + } + private void AddNewInventorySet(UsersInventory inventory) { foreach (InventoryFolderBase folder in inventory.Folders.Values) @@ -236,6 +276,9 @@ namespace OpenSim.Framework.Communications } } + /// + /// Used to create a new user inventory. + /// private class UsersInventory { public Dictionary Folders = new Dictionary(); diff --git a/OpenSim/Framework/IInventoryData.cs b/OpenSim/Framework/IInventoryData.cs index 6a500f8..d72231d 100644 --- a/OpenSim/Framework/IInventoryData.cs +++ b/OpenSim/Framework/IInventoryData.cs @@ -144,7 +144,7 @@ namespace OpenSim.Framework void moveInventoryFolder(InventoryFolderBase folder); /// - /// Deletes a folder based on its ID with folder + /// Deletes a folder. Thie will delete both the folder itself and its contents (items and descendent folders) /// /// The id of the folder void deleteInventoryFolder(LLUUID folder); diff --git a/OpenSim/Framework/InventoryItemBase.cs b/OpenSim/Framework/InventoryItemBase.cs index 8c8d858..6ed2961 100644 --- a/OpenSim/Framework/InventoryItemBase.cs +++ b/OpenSim/Framework/InventoryItemBase.cs @@ -108,8 +108,6 @@ namespace OpenSim.Framework } } - - public int InvType { get { return _invType; -- cgit v1.1