mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-25 18:07:31 +09:00
Bug 1317117 - call msgStore folder deletion during imap/news empty trash.
Also factors out some common code into nsMSgDBFolder::Delete(), and makes a couple of incidental changes to try and clarify the responsibilies of nsIMsgPluggableStore::DeleteFolder(). Tag #1273
This commit is contained in:
parent
0ef88cc19d
commit
0f885aaad1
8 changed files with 77 additions and 139 deletions
|
|
@ -51,8 +51,8 @@ interface nsIMsgPluggableStore : nsISupports {
|
||||||
nsIMsgFolder createFolder(in nsIMsgFolder aParent, in AString aFolderName);
|
nsIMsgFolder createFolder(in nsIMsgFolder aParent, in AString aFolderName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete the passed in folder. This is a real delete, not a move
|
* Delete storage for a folder and its subfolders, if any.
|
||||||
* to the trash folder.
|
* This is a real delete, not a move to the trash folder.
|
||||||
*
|
*
|
||||||
* @param aFolder folder to delete
|
* @param aFolder folder to delete
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -3559,7 +3559,31 @@ NS_IMETHODIMP nsMsgDBFolder::GetShowDeletedMessages(bool *showDeletedMessages)
|
||||||
|
|
||||||
NS_IMETHODIMP nsMsgDBFolder::Delete()
|
NS_IMETHODIMP nsMsgDBFolder::Delete()
|
||||||
{
|
{
|
||||||
return NS_OK;
|
ForceDBClosed();
|
||||||
|
|
||||||
|
// Delete the .msf file.
|
||||||
|
// NOTE: this doesn't remove .msf files in subfolders, but
|
||||||
|
// both nsMsgBrkMBoxStore::DeleteFolder() and
|
||||||
|
// nsMsgMaildirStore::DeleteFolder() will remove those .msf files
|
||||||
|
// as a side-effect of deleting the .sbd directory.
|
||||||
|
nsCOMPtr<nsIFile> summaryFile;
|
||||||
|
nsresult rv = GetSummaryFile(getter_AddRefs(summaryFile));
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
bool exists = false;
|
||||||
|
summaryFile->Exists(&exists);
|
||||||
|
if (exists) {
|
||||||
|
rv = summaryFile->Remove(false);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ask the msgStore to delete the actual storage (mbox, maildir or whatever
|
||||||
|
// else may be supported in future).
|
||||||
|
nsCOMPtr<nsIMsgPluggableStore> msgStore;
|
||||||
|
rv = GetMsgStore(getter_AddRefs(msgStore));
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
rv = msgStore->DeleteFolder(this);
|
||||||
|
|
||||||
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP nsMsgDBFolder::DeleteSubFolders(nsIArray *folders,
|
NS_IMETHODIMP nsMsgDBFolder::DeleteSubFolders(nsIArray *folders,
|
||||||
|
|
|
||||||
|
|
@ -1468,7 +1468,6 @@ NS_IMETHODIMP nsImapMailFolder::EmptyTrash(nsIMsgWindow *aMsgWindow, nsIUrlListe
|
||||||
} // if we fetched an imap server
|
} // if we fetched an imap server
|
||||||
} // if emptying trash on exit which is done through the account manager.
|
} // if emptying trash on exit which is done through the account manager.
|
||||||
|
|
||||||
nsCOMPtr<nsIMsgDatabase> trashDB;
|
|
||||||
if (WeAreOffline())
|
if (WeAreOffline())
|
||||||
{
|
{
|
||||||
nsCOMPtr <nsIMsgDatabase> trashDB;
|
nsCOMPtr <nsIMsgDatabase> trashDB;
|
||||||
|
|
@ -1485,12 +1484,7 @@ NS_IMETHODIMP nsImapMailFolder::EmptyTrash(nsIMsgWindow *aMsgWindow, nsIUrlListe
|
||||||
}
|
}
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
nsCOMPtr <nsIDBFolderInfo> transferInfo;
|
|
||||||
rv = trashFolder->GetDBTransferInfo(getter_AddRefs(transferInfo));
|
|
||||||
rv = trashFolder->Delete(); // delete summary spec
|
|
||||||
trashFolder->SetDBTransferInfo(transferInfo);
|
|
||||||
|
|
||||||
trashFolder->SetSizeOnDisk(0);
|
|
||||||
nsCOMPtr<nsIImapService> imapService = do_GetService(NS_IMAPSERVICE_CONTRACTID, &rv);
|
nsCOMPtr<nsIImapService> imapService = do_GetService(NS_IMAPSERVICE_CONTRACTID, &rv);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
|
@ -1536,7 +1530,17 @@ NS_IMETHODIMP nsImapMailFolder::EmptyTrash(nsIMsgWindow *aMsgWindow, nsIUrlListe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The trash folder has effectively been deleted
|
nsCOMPtr <nsIDBFolderInfo> transferInfo;
|
||||||
|
rv = trashFolder->GetDBTransferInfo(getter_AddRefs(transferInfo));
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
// Bulk-delete all the messages by deleting the msf file and storage.
|
||||||
|
// This is a little kludgy.
|
||||||
|
rv = trashFolder->Delete();
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
trashFolder->SetDBTransferInfo(transferInfo);
|
||||||
|
trashFolder->SetSizeOnDisk(0);
|
||||||
|
|
||||||
|
// The trash folder has effectively been deleted.
|
||||||
nsCOMPtr<nsIMsgFolderNotificationService> notifier(do_GetService(NS_MSGNOTIFICATIONSERVICE_CONTRACTID));
|
nsCOMPtr<nsIMsgFolderNotificationService> notifier(do_GetService(NS_MSGNOTIFICATIONSERVICE_CONTRACTID));
|
||||||
if (notifier)
|
if (notifier)
|
||||||
notifier->NotifyFolderDeleted(trashFolder);
|
notifier->NotifyFolderDeleted(trashFolder);
|
||||||
|
|
@ -1548,41 +1552,9 @@ NS_IMETHODIMP nsImapMailFolder::EmptyTrash(nsIMsgWindow *aMsgWindow, nsIUrlListe
|
||||||
|
|
||||||
NS_IMETHODIMP nsImapMailFolder::Delete()
|
NS_IMETHODIMP nsImapMailFolder::Delete()
|
||||||
{
|
{
|
||||||
nsresult rv;
|
nsresult rv = nsMsgDBFolder::Delete();
|
||||||
if (!mDatabase)
|
|
||||||
{
|
|
||||||
// Check if anyone has this db open. If so, do a force closed.
|
|
||||||
nsCOMPtr<nsIMsgDBService> msgDBService = do_GetService(NS_MSGDB_SERVICE_CONTRACTID, &rv);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
msgDBService->CachedDBForFolder(this, getter_AddRefs(mDatabase));
|
|
||||||
}
|
|
||||||
if (mDatabase)
|
|
||||||
{
|
|
||||||
mDatabase->ForceClosed();
|
|
||||||
mDatabase = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsCOMPtr<nsIFile> path;
|
// Should notify nsIMsgFolderListeners about the folder getting deleted?
|
||||||
rv = GetFilePath(getter_AddRefs(path));
|
|
||||||
if (NS_SUCCEEDED(rv))
|
|
||||||
{
|
|
||||||
nsCOMPtr<nsIFile> summaryLocation;
|
|
||||||
rv = GetSummaryFileLocation(path, getter_AddRefs(summaryLocation));
|
|
||||||
if (NS_SUCCEEDED(rv))
|
|
||||||
{
|
|
||||||
bool exists = false;
|
|
||||||
rv = summaryLocation->Exists(&exists);
|
|
||||||
if (NS_SUCCEEDED(rv) && exists)
|
|
||||||
{
|
|
||||||
rv = summaryLocation->Remove(false);
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
NS_WARNING("failed to remove imap summary file");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (mPath)
|
|
||||||
mPath->Remove(false);
|
|
||||||
// should notify nsIMsgFolderListeners about the folder getting deleted...
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -653,8 +653,6 @@ NS_IMETHODIMP nsMsgLocalMailFolder::EmptyTrash(nsIMsgWindow *msgWindow,
|
||||||
if (NS_SUCCEEDED(rv))
|
if (NS_SUCCEEDED(rv))
|
||||||
{
|
{
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
nsCString trashUri;
|
|
||||||
trashFolder->GetURI(trashUri);
|
|
||||||
trashFolder->GetFlags(&flags);
|
trashFolder->GetFlags(&flags);
|
||||||
int32_t totalMessages = 0;
|
int32_t totalMessages = 0;
|
||||||
rv = trashFolder->GetTotalMessages(true, &totalMessages);
|
rv = trashFolder->GetTotalMessages(true, &totalMessages);
|
||||||
|
|
@ -750,43 +748,6 @@ nsresult nsMsgLocalMailFolder::IsChildOfTrash(bool *result)
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP nsMsgLocalMailFolder::Delete()
|
|
||||||
{
|
|
||||||
nsresult rv;
|
|
||||||
nsCOMPtr<nsIMsgDBService> msgDBService = do_GetService(NS_MSGDB_SERVICE_CONTRACTID, &rv);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
msgDBService->CachedDBForFolder(this, getter_AddRefs(mDatabase));
|
|
||||||
if (mDatabase)
|
|
||||||
{
|
|
||||||
mDatabase->ForceClosed();
|
|
||||||
mDatabase = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsCOMPtr<nsIMsgIncomingServer> server;
|
|
||||||
rv = GetServer(getter_AddRefs(server));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
nsCOMPtr<nsIMsgPluggableStore> msgStore;
|
|
||||||
|
|
||||||
rv = server->GetMsgStore(getter_AddRefs(msgStore));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
nsCOMPtr <nsIFile> summaryFile;
|
|
||||||
rv = GetSummaryFile(getter_AddRefs(summaryFile));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
//Clean up .sbd folder if it exists.
|
|
||||||
// Remove summary file.
|
|
||||||
rv = summaryFile->Remove(false);
|
|
||||||
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Could not delete msg summary file");
|
|
||||||
|
|
||||||
rv = msgStore->DeleteFolder(this);
|
|
||||||
if (rv == NS_ERROR_FILE_NOT_FOUND ||
|
|
||||||
rv == NS_ERROR_FILE_TARGET_DOES_NOT_EXIST)
|
|
||||||
rv = NS_OK; // virtual folders do not have a msgStore file
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP nsMsgLocalMailFolder::DeleteSubFolders(nsIArray *folders, nsIMsgWindow *msgWindow)
|
NS_IMETHODIMP nsMsgLocalMailFolder::DeleteSubFolders(nsIArray *folders, nsIMsgWindow *msgWindow)
|
||||||
{
|
{
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
|
|
|
||||||
|
|
@ -120,7 +120,6 @@ public:
|
||||||
NS_IMETHOD Compact(nsIUrlListener *aListener, nsIMsgWindow *aMsgWindow) override;
|
NS_IMETHOD Compact(nsIUrlListener *aListener, nsIMsgWindow *aMsgWindow) override;
|
||||||
NS_IMETHOD CompactAll(nsIUrlListener *aListener, nsIMsgWindow *aMsgWindow, bool aCompactOfflineAlso) override;
|
NS_IMETHOD CompactAll(nsIUrlListener *aListener, nsIMsgWindow *aMsgWindow, bool aCompactOfflineAlso) override;
|
||||||
NS_IMETHOD EmptyTrash(nsIMsgWindow *msgWindow, nsIUrlListener *aListener) override;
|
NS_IMETHOD EmptyTrash(nsIMsgWindow *msgWindow, nsIUrlListener *aListener) override;
|
||||||
NS_IMETHOD Delete () override;
|
|
||||||
NS_IMETHOD DeleteSubFolders(nsIArray *folders, nsIMsgWindow *msgWindow) override;
|
NS_IMETHOD DeleteSubFolders(nsIArray *folders, nsIMsgWindow *msgWindow) override;
|
||||||
NS_IMETHOD CreateStorageIfMissing(nsIUrlListener* urlListener) override;
|
NS_IMETHOD CreateStorageIfMissing(nsIUrlListener* urlListener) override;
|
||||||
NS_IMETHOD Rename (const nsAString& aNewName, nsIMsgWindow *msgWindow) override;
|
NS_IMETHOD Rename (const nsAString& aNewName, nsIMsgWindow *msgWindow) override;
|
||||||
|
|
|
||||||
|
|
@ -300,26 +300,30 @@ NS_IMETHODIMP nsMsgBrkMBoxStore::SetSummaryFileValid(nsIMsgFolder *aFolder,
|
||||||
NS_IMETHODIMP nsMsgBrkMBoxStore::DeleteFolder(nsIMsgFolder *aFolder)
|
NS_IMETHODIMP nsMsgBrkMBoxStore::DeleteFolder(nsIMsgFolder *aFolder)
|
||||||
{
|
{
|
||||||
NS_ENSURE_ARG_POINTER(aFolder);
|
NS_ENSURE_ARG_POINTER(aFolder);
|
||||||
//Delete mailbox
|
bool exists;
|
||||||
|
|
||||||
|
// Delete mbox file.
|
||||||
nsCOMPtr<nsIFile> pathFile;
|
nsCOMPtr<nsIFile> pathFile;
|
||||||
nsresult rv = aFolder->GetFilePath(getter_AddRefs(pathFile));
|
nsresult rv = aFolder->GetFilePath(getter_AddRefs(pathFile));
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
pathFile->Remove(false);
|
exists = false;
|
||||||
|
pathFile->Exists(&exists);
|
||||||
bool isDirectory = false;
|
if (exists) {
|
||||||
pathFile->IsDirectory(&isDirectory);
|
rv = pathFile->Remove(false);
|
||||||
if (!isDirectory)
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
{
|
|
||||||
nsAutoString leafName;
|
|
||||||
pathFile->GetLeafName(leafName);
|
|
||||||
leafName.AppendLiteral(FOLDER_SUFFIX);
|
|
||||||
pathFile->SetLeafName(leafName);
|
|
||||||
}
|
}
|
||||||
isDirectory = false;
|
|
||||||
pathFile->IsDirectory(&isDirectory);
|
// Delete any subfolders (.sbd-suffixed directories).
|
||||||
//If this is a directory, then remove it.
|
AddDirectorySeparator(pathFile);
|
||||||
return isDirectory ? pathFile->Remove(true) : NS_OK;
|
exists = false;
|
||||||
|
pathFile->Exists(&exists);
|
||||||
|
if (exists) {
|
||||||
|
rv = pathFile->Remove(true);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP nsMsgBrkMBoxStore::RenameFolder(nsIMsgFolder *aFolder,
|
NS_IMETHODIMP nsMsgBrkMBoxStore::RenameFolder(nsIMsgFolder *aFolder,
|
||||||
|
|
|
||||||
|
|
@ -323,19 +323,30 @@ NS_IMETHODIMP nsMsgMaildirStore::SetSummaryFileValid(nsIMsgFolder *aFolder,
|
||||||
NS_IMETHODIMP nsMsgMaildirStore::DeleteFolder(nsIMsgFolder *aFolder)
|
NS_IMETHODIMP nsMsgMaildirStore::DeleteFolder(nsIMsgFolder *aFolder)
|
||||||
{
|
{
|
||||||
NS_ENSURE_ARG_POINTER(aFolder);
|
NS_ENSURE_ARG_POINTER(aFolder);
|
||||||
|
bool exists;
|
||||||
|
|
||||||
// Delete Maildir structure
|
// Delete the Maildir itself.
|
||||||
nsCOMPtr<nsIFile> pathFile;
|
nsCOMPtr<nsIFile> pathFile;
|
||||||
nsresult rv = aFolder->GetFilePath(getter_AddRefs(pathFile));
|
nsresult rv = aFolder->GetFilePath(getter_AddRefs(pathFile));
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
rv = pathFile->Remove(true); // recursive
|
exists = false;
|
||||||
AddDirectorySeparator(pathFile);
|
|
||||||
bool exists;
|
|
||||||
pathFile->Exists(&exists);
|
pathFile->Exists(&exists);
|
||||||
if (exists)
|
if (exists) {
|
||||||
pathFile->Remove(true);
|
rv = pathFile->Remove(true);
|
||||||
return rv;
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete any subfolders (.sbd-suffixed directories).
|
||||||
|
AddDirectorySeparator(pathFile);
|
||||||
|
exists = false;
|
||||||
|
pathFile->Exists(&exists);
|
||||||
|
if (exists) {
|
||||||
|
rv = pathFile->Remove(true);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP nsMsgMaildirStore::RenameFolder(nsIMsgFolder *aFolder,
|
NS_IMETHODIMP nsMsgMaildirStore::RenameFolder(nsIMsgFolder *aFolder,
|
||||||
|
|
|
||||||
|
|
@ -495,41 +495,8 @@ NS_IMETHODIMP nsMsgNewsFolder::CreateSubfolder(const nsAString& newsgroupName,
|
||||||
|
|
||||||
NS_IMETHODIMP nsMsgNewsFolder::Delete()
|
NS_IMETHODIMP nsMsgNewsFolder::Delete()
|
||||||
{
|
{
|
||||||
nsresult rv = GetDatabase();
|
nsresult rv = nsMsgDBFolder::Delete();
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
if(NS_SUCCEEDED(rv))
|
|
||||||
{
|
|
||||||
mDatabase->ForceClosed();
|
|
||||||
mDatabase = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsCOMPtr<nsIFile> folderPath;
|
|
||||||
rv = GetFilePath(getter_AddRefs(folderPath));
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(rv))
|
|
||||||
{
|
|
||||||
nsCOMPtr<nsIFile> summaryPath;
|
|
||||||
rv = GetSummaryFileLocation(folderPath, getter_AddRefs(summaryPath));
|
|
||||||
if (NS_SUCCEEDED(rv))
|
|
||||||
{
|
|
||||||
bool exists = false;
|
|
||||||
rv = folderPath->Exists(&exists);
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(rv) && exists)
|
|
||||||
rv = folderPath->Remove(false);
|
|
||||||
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
NS_WARNING("Failed to remove News Folder");
|
|
||||||
|
|
||||||
rv = summaryPath->Exists(&exists);
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(rv) && exists)
|
|
||||||
rv = summaryPath->Remove(false);
|
|
||||||
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
NS_WARNING("Failed to remove News Folder Summary File");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nsCOMPtr <nsINntpIncomingServer> nntpServer;
|
nsCOMPtr <nsINntpIncomingServer> nntpServer;
|
||||||
rv = GetNntpServer(getter_AddRefs(nntpServer));
|
rv = GetNntpServer(getter_AddRefs(nntpServer));
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue