* 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.
0.6.0-stable
Justin Clarke Casey 2008-04-23 17:04:15 +00:00
parent 2a3bdde0fa
commit 4db839c3b8
10 changed files with 115 additions and 15 deletions

View File

@ -637,7 +637,7 @@ namespace OpenSim.Data.MySQL
}
/// <summary>
/// Delete an inventory folder
/// Deletes an inventory folder
/// </summary>
/// <param name="folderId">Id of folder to delete</param>
public void deleteInventoryFolder(LLUUID folderID)

View File

@ -79,14 +79,12 @@ namespace OpenSim.Framework.Communications.Cache
/// <summary>
/// Delete all the folders and items in this folder.
///
/// TODO: This method is not used yet, but will be shortly
/// </summary>
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
}
/// <summary>
/// Return the list of folders in this folder
/// Return the list of immediate child folders in this folder.
/// </summary>
public List<InventoryFolderBase> RequestListOfFolders()
{

View File

@ -496,6 +496,11 @@ namespace OpenSim.Framework.Communications.Cache
return new List<InventoryItemBase>();
}
/// <summary>
/// This should delete all the items and folders in the given directory.
/// </summary>
/// <param name="remoteClient"></param>
/// <param name="folderID"></param>
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<InventoryItemBase> 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<InventoryItemBase> items = purgedFolder.RequestListOfItems();
foreach (InventoryItemBase item in items)
{
userProfile.DeleteItem(remoteClient.AgentId, item);
}
}
purgedFolder.Purge();
}
}
else

View File

@ -56,8 +56,20 @@ namespace OpenSim.Framework.Communications
/// <param name="folder"></param>
void AddNewInventoryFolder(LLUUID userID, InventoryFolderBase folder);
/// <summary>
/// Move an inventory folder to a new location
/// </summary>
/// <param name="userID"></param>
/// <param name="folder">A folder containing the details of the new location</param>
void MoveInventoryFolder(LLUUID userID, InventoryFolderBase folder);
/// <summary>
/// Purge an inventory folder of all its items and subfolders.
/// </summary>
/// <param name="userID"></param>
/// <param name="folder"></param>
void PurgeInventoryFolder(LLUUID userID, InventoryFolderBase folder);
/// <summary>
/// Add a new item to the given user's inventory
/// </summary>

View File

@ -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
}
}
/// <summary>
/// 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.
/// </summary>
/// <param name="folder"></param>
protected void PurgeFolder(InventoryFolderBase folder)
{
List<InventoryFolderBase> subFolders = RequestSubFolders(folder.ID);
foreach (InventoryFolderBase subFolder in subFolders)
{
// m_log.DebugFormat("[AGENT INVENTORY]: Deleting folder {0} {1}", subFolder.Name, subFolder.ID);
foreach (KeyValuePair<string, IInventoryData> plugin in m_plugins)
{
plugin.Value.deleteInventoryFolder(subFolder.ID);
}
}
// XXX Temporarily don't delete the items since UserProfileCacheService is still doing this
// List<InventoryItemBase> 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
}
}
/// <summary>
/// Used to create a new user inventory.
/// </summary>
private class UsersInventory
{
public Dictionary<LLUUID, InventoryFolderBase> Folders = new Dictionary<LLUUID, InventoryFolderBase>();

View File

@ -144,7 +144,7 @@ namespace OpenSim.Framework
void moveInventoryFolder(InventoryFolderBase folder);
/// <summary>
/// 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)
/// </summary>
/// <param name="folder">The id of the folder</param>
void deleteInventoryFolder(LLUUID folder);

View File

@ -108,8 +108,6 @@ namespace OpenSim.Framework
}
}
public int InvType {
get {
return _invType;

View File

@ -220,6 +220,16 @@ namespace OpenSim.Grid.InventoryServer
MoveExistingInventoryFolder(folder);
return true;
}
/// <summary>
/// <see cref="OpenSim.Framework.Communications.IInventoryServices"></see>
/// </summary>
/// <param name="userID"></param>
/// <param name="folder"></param>
public override void PurgeInventoryFolder(LLUUID userID, InventoryFolderBase folder)
{
// XXX No implementation yet (temporarily)!
}
public bool AddInventoryItem(InventoryItemBase item)
{

View File

@ -100,6 +100,16 @@ namespace OpenSim.Region.Communications.Local
DeleteItem(item);
}
/// <summary>
/// <see cref="OpenSim.Framework.Communications.IInventoryServices"></see>
/// </summary>
/// <param name="userID"></param>
/// <param name="folder"></param>
public override void PurgeInventoryFolder(LLUUID userID, InventoryFolderBase folder)
{
PurgeFolder(folder);
}
public override bool HasInventoryForUser(LLUUID userID)
{
InventoryFolderBase root = RequestRootFolder(userID);

View File

@ -175,6 +175,16 @@ namespace OpenSim.Region.Communications.OGS1
e.Source, e.Message);
}
}
/// <summary>
/// <see cref="OpenSim.Framework.Communications.IInventoryServices"></see>
/// </summary>
/// <param name="userID"></param>
/// <param name="folder"></param>
public void PurgeInventoryFolder(LLUUID userID, InventoryFolderBase folder)
{
// XXX No implementation yet (temporarily)!
}
public void AddNewInventoryItem(LLUUID userID, InventoryItemBase item)
{