diff --git a/mailnews/base/public/msgCore.h b/mailnews/base/public/msgCore.h index bbd82b07fe40..ee0f77278dfc 100644 --- a/mailnews/base/public/msgCore.h +++ b/mailnews/base/public/msgCore.h @@ -131,6 +131,8 @@ NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_MAILNEWS, value) #define NS_MSG_NEWS_ARTICLE_NOT_FOUND NS_MSG_GENERATE_FAILURE(25) +#define NS_MSG_ERROR_COPY_FOLDER_ABORTED NS_MSG_GENERATE_FAILURE(26) + /* ducarroz: error codes for message compose are defined into compose\src\nsMsgComposeStringBundle.h. Message compose use the same error code space than other mailnews modules. To avoid any conflict, I reserve values between 12500 and 12999 for it. diff --git a/mailnews/base/public/nsIMsgFolder.idl b/mailnews/base/public/nsIMsgFolder.idl index ba0b47f3b9a1..f3ef128ee56f 100644 --- a/mailnews/base/public/nsIMsgFolder.idl +++ b/mailnews/base/public/nsIMsgFolder.idl @@ -159,7 +159,7 @@ const nsMsgBiffState nsMsgBiffState_Unknown = 2; // We dunno whether there is ne * @param name the new name of the folder */ void rename(in wstring name, in nsIMsgWindow msgWindow); - void renameSubFolders( in nsIMsgFolder oldFolder); + void renameSubFolders( in nsIMsgWindow msgWindow, in nsIMsgFolder oldFolder); /** * looks in immediate children of this folder for the given name * @@ -366,7 +366,9 @@ const nsMsgBiffState nsMsgBiffState_Unknown = 2; // We dunno whether there is ne const unsigned long allMessageCountNotifications = 0; void enableNotifications(in long notificationType, in boolean enable); boolean isCommandEnabled(in string command); - boolean changeFilterDestination(in nsIMsgFolder folder, in boolean caseInsensitive); + boolean matchOrChangeFilterDestination(in nsIMsgFolder folder, in boolean caseInsensitive); + boolean confirmFolderDeletionForFilter(in nsIMsgWindow msgWindow); + void alertFilterChanged(in nsIMsgWindow msgWindow); void notifyCompactCompleted(); attribute nsIMsgRetentionSettings retentionSettings; diff --git a/mailnews/base/resources/locale/en-US/messenger.properties b/mailnews/base/resources/locale/en-US/messenger.properties index f9dd45fa07f9..2c94b1e69cc2 100644 --- a/mailnews/base/resources/locale/en-US/messenger.properties +++ b/mailnews/base/resources/locale/en-US/messenger.properties @@ -64,9 +64,12 @@ sendingUnsent=Sending Unsent Messages compactingFolder=Compacting folder %S... autoCompactAllFolders=Do you wish to compact all local and offline folders to save disk space? -disableFilter=Filters that are affected by deleting '%S' folder are now disabled. +confirmFolderDeletionForFilter=Deleting the folder '%S' will disable its associated filter(s). Are you sure you want to delete the folder? +alertFilterChanged=Filters associated with this folder will be updated. +alertFilterCheckbox=Do not warn me again. compactFolderDeniedLock=The folder '%S' cannot be compacted because another operation is in progress. Please try again later. compactFolderWriteFailed=The folder '%S' could not be compacted because writing to folder failed. Verify that you have enough disk space, and that you have write privileges to the file system, then try again. + # LOCALIZATION NOTES(verboseFolderFormat): %1$S is folder name, %2$S is server name verboseFolderFormat=%1$S on %2$S diff --git a/mailnews/base/search/public/nsIMsgFilterList.idl b/mailnews/base/search/public/nsIMsgFilterList.idl index db21182f3c6a..b6741aa52eb2 100644 --- a/mailnews/base/search/public/nsIMsgFilterList.idl +++ b/mailnews/base/search/public/nsIMsgFilterList.idl @@ -101,7 +101,7 @@ interface nsIMsgFilterList : nsISupports { void writeStrAttr(in nsMsgFilterFileAttribValue attrib, in string value, in nsIOFileStream stream); void writeWstrAttr(in nsMsgFilterFileAttribValue attrib, in wstring value, in nsIOFileStream stream); void writeBoolAttr(in nsMsgFilterFileAttribValue attrib, in boolean value, in nsIOFileStream stream); - boolean changeFilterTarget(in string oldUri, in string newUri, in boolean caseInsensitive); + boolean matchOrChangeFilterTarget(in string oldUri, in string newUri, in boolean caseInsensitive); }; diff --git a/mailnews/base/search/src/nsMsgFilterList.cpp b/mailnews/base/search/src/nsMsgFilterList.cpp index 29ad4cc0ab31..e2ec7e2a2058 100644 --- a/mailnews/base/search/src/nsMsgFilterList.cpp +++ b/mailnews/base/search/src/nsMsgFilterList.cpp @@ -905,7 +905,7 @@ nsMsgFilterList::GetVersion(PRInt16 *aResult) return NS_OK; } -NS_IMETHODIMP nsMsgFilterList::ChangeFilterTarget(const char *oldFolderUri, const char *newFolderUri, PRBool caseInsensitive, PRBool *changed) +NS_IMETHODIMP nsMsgFilterList::MatchOrChangeFilterTarget(const char *oldFolderUri, const char *newFolderUri, PRBool caseInsensitive, PRBool *found) { nsresult rv = NS_OK; PRUint32 numFilters; @@ -930,18 +930,20 @@ NS_IMETHODIMP nsMsgFilterList::ChangeFilterTarget(const char *oldFolderUri, cons { if (PL_strcasecmp(folderUri,oldFolderUri) == 0 ) //local { - rv = filter->SetActionTargetFolderUri(newFolderUri); + if (newFolderUri) //in the case where we just want to match the uri's newFolderUri will be null + rv = filter->SetActionTargetFolderUri(newFolderUri); NS_ENSURE_SUCCESS(rv,rv); - *changed =PR_TRUE; + *found =PR_TRUE; } } else { if (PL_strcmp(folderUri,oldFolderUri) == 0 ) //imap { - rv = filter->SetActionTargetFolderUri(newFolderUri); + if (newFolderUri) //in the case where we just want to match the uri's newFolderUri will be null + rv = filter->SetActionTargetFolderUri(newFolderUri); NS_ENSURE_SUCCESS(rv,rv); - *changed =PR_TRUE; + *found =PR_TRUE; } } } diff --git a/mailnews/base/util/nsMsgDBFolder.cpp b/mailnews/base/util/nsMsgDBFolder.cpp index 87427797fd31..fe5873e18dfc 100644 --- a/mailnews/base/util/nsMsgDBFolder.cpp +++ b/mailnews/base/util/nsMsgDBFolder.cpp @@ -44,7 +44,6 @@ #include "nsIPrompt.h" #include "nsIInterfaceRequestor.h" #include "nsIInterfaceRequestorUtils.h" -#include "nsIStringBundle.h" #define oneHour 3600000000 @@ -1436,53 +1435,34 @@ nsMsgDBFolder::AutoCompact(nsIMsgWindow *aWindow) NS_ENSURE_SUCCESS(rv, rv); if (totalExpungedBytes > (purgeThreshold*1024)) { - nsCOMPtr docShell; - if (aWindow) + nsXPIDLString confirmString; + PRBool okToCompact = PR_FALSE; + rv = GetStringFromBundle("autoCompactAllFolders", getter_Copies(confirmString)); + if (NS_SUCCEEDED(rv) && confirmString) + ThrowConfirmationPrompt(aWindow, confirmString.get(), &okToCompact); + if (okToCompact) { - aWindow->GetRootDocShell(getter_AddRefs(docShell)); - nsCOMPtr bundleService = - do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr bundle; - rv = bundleService->CreateBundle("chrome://messenger/locale/messenger.properties", - getter_AddRefs(bundle)); - NS_ENSURE_SUCCESS(rv, rv); - nsXPIDLString alertString; - bundle->GetStringFromName(NS_LITERAL_STRING("autoCompactAllFolders").get(), - getter_Copies(alertString)); - if (docShell) + if ( localExpungedBytes > 0) { - nsCOMPtr dialog(do_GetInterface(docShell)); - if (dialog && alertString) - { - PRBool okToCompact = PR_FALSE; - dialog->Confirm(nsnull, alertString.get(), &okToCompact); - if (okToCompact) - { - if ( localExpungedBytes > 0) - { - nsCOMPtr aSupports = getter_AddRefs(folderArray->ElementAt(0)); - nsCOMPtr msgFolder = do_QueryInterface(aSupports, &rv); - if (msgFolder && NS_SUCCEEDED(rv)) - if (offlineExpungedBytes > 0) - msgFolder->CompactAll(nsnull, aWindow, folderArray, PR_TRUE, offlineFolderArray); - else - msgFolder->CompactAll(nsnull, aWindow, folderArray, PR_FALSE, nsnull); - } - else if (offlineExpungedBytes > 0) - CompactAllOfflineStores(aWindow, offlineFolderArray); - } - } + nsCOMPtr aSupports = getter_AddRefs(folderArray->ElementAt(0)); + nsCOMPtr msgFolder = do_QueryInterface(aSupports, &rv); + if (msgFolder && NS_SUCCEEDED(rv)) + if (offlineExpungedBytes > 0) + msgFolder->CompactAll(nsnull, aWindow, folderArray, PR_TRUE, offlineFolderArray); + else + msgFolder->CompactAll(nsnull, aWindow, folderArray, PR_FALSE, nsnull); } - } + else if (offlineExpungedBytes > 0) + CompactAllOfflineStores(aWindow, offlineFolderArray); + } } } - } + } gtimeOfLastPurgeCheck = PR_Now(); } return rv; } - + NS_IMETHODIMP nsMsgDBFolder::CompactAllOfflineStores(nsIMsgWindow *aWindow, nsISupportsArray *aOfflineFolderArray) { @@ -1532,7 +1512,7 @@ nsMsgDBFolder::GetPurgeThreshold(PRInt32 *aThreshold) } NS_IMETHODIMP //called on the folder that is renamed or about to be deleted -nsMsgDBFolder::ChangeFilterDestination(nsIMsgFolder *newFolder, PRBool caseInsensitive, PRBool *changed) +nsMsgDBFolder::MatchOrChangeFilterDestination(nsIMsgFolder *newFolder, PRBool caseInsensitive, PRBool *found) { nsresult rv = NS_OK; nsXPIDLCString oldUri; @@ -1540,7 +1520,7 @@ nsMsgDBFolder::ChangeFilterDestination(nsIMsgFolder *newFolder, PRBool caseInsen NS_ENSURE_SUCCESS(rv,rv); nsXPIDLCString newUri; - if (newFolder) //for delete this will be null + if (newFolder) //for matching uri's this will be null { rv = newFolder->GetURI(getter_Copies(newUri)); NS_ENSURE_SUCCESS(rv,rv); @@ -1569,8 +1549,8 @@ nsMsgDBFolder::ChangeFilterDestination(nsIMsgFolder *newFolder, PRBool caseInsen rv = server->GetFilterList(getter_AddRefs(filterList)); if (filterList && NS_SUCCEEDED(rv)) { - rv = filterList->ChangeFilterTarget(oldUri, newUri, caseInsensitive, changed); - if (changed) + rv = filterList->MatchOrChangeFilterTarget(oldUri, newUri, caseInsensitive, found); + if (found && newFolder && newUri) rv = filterList->SaveToDefaultFile(); } } diff --git a/mailnews/base/util/nsMsgDBFolder.h b/mailnews/base/util/nsMsgDBFolder.h index f1e026e6c2c3..6ab638d306f7 100644 --- a/mailnews/base/util/nsMsgDBFolder.h +++ b/mailnews/base/util/nsMsgDBFolder.h @@ -100,7 +100,7 @@ public: NS_IMETHOD GetOfflineStoreOutputStream(nsIOutputStream **outputStream); NS_IMETHOD GetOfflineStoreInputStream(nsIInputStream **outputStream); NS_IMETHOD IsCommandEnabled(const char *command, PRBool *result); - NS_IMETHOD ChangeFilterDestination(nsIMsgFolder *oldFolder, PRBool caseInsensitive, PRBool *changed); + NS_IMETHOD MatchOrChangeFilterDestination(nsIMsgFolder *oldFolder, PRBool caseInsensitive, PRBool *changed); protected: virtual nsresult ReadDBFolderInfo(PRBool force); diff --git a/mailnews/base/util/nsMsgFolder.cpp b/mailnews/base/util/nsMsgFolder.cpp index b51c3ef88083..e9923b3f84b2 100644 --- a/mailnews/base/util/nsMsgFolder.cpp +++ b/mailnews/base/util/nsMsgFolder.cpp @@ -58,8 +58,8 @@ #include "nsIPrompt.h" #include "nsIInterfaceRequestor.h" #include "nsIInterfaceRequestorUtils.h" -#include "nsIStringBundle.h" -#include "nsTextFormatter.h" + +#define PREF_MAIL_WARN_FILTER_CHANGED "mail.warn_filter_changed" static NS_DEFINE_CID(kStandardUrlCID, NS_STANDARDURL_CID); static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); @@ -1172,11 +1172,7 @@ NS_IMETHODIMP nsMsgFolder::RecursiveDelete(PRBool deleteStorage, nsIMsgWindow *m // now delete the disk storage for _this_ if (deleteStorage && (status == NS_OK)) - { - if ((mFlags & MSG_FOLDER_FLAG_TRASH) == 0) - WarnAndDisableFilter(msgWindow); status = Delete(); - } return status; } @@ -1222,7 +1218,7 @@ NS_IMETHODIMP nsMsgFolder::Rename(const PRUnichar *name, nsIMsgWindow *msgWindow } -NS_IMETHODIMP nsMsgFolder::RenameSubFolders(nsIMsgFolder *oldFolder) +NS_IMETHODIMP nsMsgFolder::RenameSubFolders(nsIMsgWindow *msgWindow, nsIMsgFolder *oldFolder) { return NS_ERROR_NOT_IMPLEMENTED; } @@ -2615,48 +2611,130 @@ NS_IMETHODIMP nsMsgFolder::GenerateMessageURI(nsMsgKey msgKey, char **aURI) return NS_OK; } -nsresult nsMsgFolder::WarnAndDisableFilter(nsIMsgWindow *msgWindow) +nsresult +nsMsgFolder::GetBaseStringBundle(nsIStringBundle **aBundle) { - nsresult rv = NS_OK; - PRBool changed =PR_FALSE; - rv = ChangeFilterDestination(nsnull, PR_FALSE, &changed); - if (msgWindow && changed) + nsresult rv=NS_OK; + NS_ENSURE_ARG_POINTER(aBundle); + nsCOMPtr bundleService = + do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv); + nsCOMPtr bundle; + if (bundleService && NS_SUCCEEDED(rv)) + bundleService->CreateBundle("chrome://messenger/locale/messenger.properties", + getter_AddRefs(bundle)); + *aBundle = bundle; + NS_IF_ADDREF(*aBundle); + return rv; +} + +nsresult //Do not use this routine if you have to call it very often because it creates a new bundle each time +nsMsgFolder::GetStringFromBundle(const char *msgName, PRUnichar **aResult) +{ + nsresult rv=NS_OK; + NS_ENSURE_ARG_POINTER(aResult); + nsCOMPtr bundle; + rv = GetBaseStringBundle(getter_AddRefs(bundle)); + if (NS_SUCCEEDED(rv) && bundle) + rv=bundle->GetStringFromName(NS_ConvertASCIItoUCS2(msgName).get(), aResult); + return rv; + +} + +nsresult +nsMsgFolder::ThrowConfirmationPrompt(nsIMsgWindow *msgWindow, const PRUnichar *confirmString, PRBool *confirmed) +{ + nsresult rv=NS_OK; + if (msgWindow) { nsCOMPtr docShell; msgWindow->GetRootDocShell(getter_AddRefs(docShell)); - nsCOMPtr bundleService = - do_GetService(NS_STRINGBUNDLE_CONTRACTID); - if (bundleService) + if (docShell) { - nsCOMPtr bundle; - bundleService->CreateBundle("chrome://messenger/locale/messenger.properties", - getter_AddRefs(bundle)); - if (bundle) - { - nsXPIDLString formatString; - bundle->GetStringFromName(NS_LITERAL_STRING("disableFilter").get(), - getter_Copies(formatString)); - nsXPIDLString folderName; - GetName(getter_Copies(folderName)); - if (folderName && formatString) - { - PRUnichar *alertString = nsTextFormatter::smprintf(formatString.get(), folderName.get()); - if (docShell) - { - nsCOMPtr dialog(do_GetInterface(docShell)); - if (dialog && alertString) - { - dialog->Alert(nsnull, alertString); - nsTextFormatter::smprintf_free(alertString); - } - } - } - } + nsCOMPtr dialog(do_GetInterface(docShell)); + if (dialog && confirmString) + dialog->Confirm(nsnull, confirmString, confirmed); } } return rv; } + +NS_IMETHODIMP nsMsgFolder::ConfirmFolderDeletionForFilter(nsIMsgWindow *msgWindow, PRBool *confirmed) +{ + nsCOMPtr bundle; + nsresult rv = GetBaseStringBundle(getter_AddRefs(bundle)); + if (NS_SUCCEEDED(rv) && bundle) + { + nsXPIDLString folderName; + GetName(getter_Copies(folderName)); + const PRUnichar *formatStrings[] = + { + folderName + }; + nsXPIDLString confirmString; + rv = bundle->FormatStringFromName(NS_ConvertASCIItoUCS2("confirmFolderDeletionForFilter").get(), + formatStrings, 1, + getter_Copies(confirmString)); + + rv = ThrowConfirmationPrompt(msgWindow, confirmString.get(), confirmed); + } + return rv; +} + +NS_IMETHODIMP nsMsgFolder::AlertFilterChanged(nsIMsgWindow *msgWindow) +{ + nsresult rv = NS_OK; + PRBool checkBox=PR_FALSE; + GetWarnFilterChanged(&checkBox); + if (msgWindow && !checkBox) + { + nsCOMPtr docShell; + msgWindow->GetRootDocShell(getter_AddRefs(docShell)); + nsXPIDLString alertString; + rv = GetStringFromBundle("alertFilterChanged", getter_Copies(alertString)); + nsXPIDLString alertCheckbox; + rv = GetStringFromBundle("alertFilterCheckbox", getter_Copies(alertCheckbox)); + if (alertString && alertCheckbox && docShell) + { + nsCOMPtr dialog(do_GetInterface(docShell)); + if (dialog) + { + dialog->AlertCheck(nsnull, alertString, alertCheckbox, &checkBox); + SetWarnFilterChanged(checkBox); + } + } + } + return rv; +} + +nsresult +nsMsgFolder::GetWarnFilterChanged(PRBool *aVal) +{ + NS_ENSURE_ARG(aVal); + nsresult rv; + nsCOMPtr prefService = do_GetService(NS_PREF_CONTRACTID, &rv); + if (NS_SUCCEEDED(rv) && prefService) + { + rv = prefService->GetBoolPref(PREF_MAIL_WARN_FILTER_CHANGED, aVal); + if (NS_FAILED(rv)) + { + *aVal = PR_FALSE; + rv = NS_OK; + } + } + return rv; +} + +nsresult +nsMsgFolder::SetWarnFilterChanged(PRBool aVal) +{ + nsresult rv=NS_OK; + nsCOMPtr prefService = do_GetService(NS_PREF_CONTRACTID, &rv); + if (NS_SUCCEEDED(rv) && prefService) + rv = prefService->SetBoolPref(PREF_MAIL_WARN_FILTER_CHANGED, aVal); + return rv; +} + NS_IMETHODIMP nsMsgFolder::NotifyCompactCompleted() { NS_ASSERTION(PR_FALSE, "should be overridden by child class"); diff --git a/mailnews/base/util/nsMsgFolder.h b/mailnews/base/util/nsMsgFolder.h index 5cb8cc623f7c..7b08ddf4ceae 100644 --- a/mailnews/base/util/nsMsgFolder.h +++ b/mailnews/base/util/nsMsgFolder.h @@ -41,6 +41,7 @@ #include "nsIMsgFilterList.h" #include "nsIUrlListener.h" #include "nsIFileSpec.h" +class nsIStringBundle; /* * MsgFolder @@ -101,7 +102,7 @@ public: NS_IMETHOD CompactAll(nsIUrlListener *aListener, nsIMsgWindow *msgWindow, nsISupportsArray *aFolderArray, PRBool aCompactOfflineAlso, nsISupportsArray *aOfflineFolderArray); NS_IMETHOD EmptyTrash(nsIMsgWindow *msgWindow, nsIUrlListener *aListener); NS_IMETHOD Rename(const PRUnichar *name, nsIMsgWindow *msgWindow); - NS_IMETHOD RenameSubFolders(nsIMsgFolder *msgFolder); + NS_IMETHOD RenameSubFolders(nsIMsgWindow *msgWindow, nsIMsgFolder *msgFolder); NS_IMETHOD ContainsChildNamed(const char *name, PRBool *_retval); NS_IMETHOD IsAncestorOf(nsIMsgFolder *folder, PRBool *_retval); NS_IMETHOD GenerateUniqueSubfolderName(const char *prefix, nsIMsgFolder *otherFolder, char **_retval); @@ -176,6 +177,8 @@ public: NS_IMETHOD GetChildWithURI(const char *uri, PRBool deep, PRBool caseInsensitive, nsIMsgFolder **_retval); NS_IMETHOD EnableNotifications(PRInt32 notificationType, PRBool enable); NS_IMETHOD NotifyCompactCompleted(); + NS_IMETHOD ConfirmFolderDeletionForFilter(nsIMsgWindow *msgWindow, PRBool *confirmed); + NS_IMETHOD AlertFilterChanged(nsIMsgWindow *msgWindow); // end NS_DECL_NSIMSGFOLDER @@ -237,7 +240,11 @@ protected: // helper routine to parse the URI and update member variables nsresult parseURI(PRBool needServer=PR_FALSE); - nsresult WarnAndDisableFilter(nsIMsgWindow *msgWindow); + nsresult GetBaseStringBundle(nsIStringBundle **aBundle); + nsresult GetStringFromBundle(const char* msgName, PRUnichar **aResult); + nsresult ThrowConfirmationPrompt(nsIMsgWindow *msgWindow, const PRUnichar *confirmString, PRBool *confirmed); + nsresult GetWarnFilterChanged(PRBool *aVal); + nsresult SetWarnFilterChanged(PRBool aVal); protected: PRUint32 mFlags; nsWeakPtr mParent; //This won't be refcounted for ownership reasons. diff --git a/mailnews/imap/public/nsIImapServerSink.idl b/mailnews/imap/public/nsIImapServerSink.idl index 4e3904559113..e42edac4afdd 100644 --- a/mailnews/imap/public/nsIImapServerSink.idl +++ b/mailnews/imap/public/nsIImapServerSink.idl @@ -32,7 +32,7 @@ interface nsIImapServerSink : nsISupports { void discoveryDone(); void onlineFolderDelete(in string aFolderName); void onlineFolderCreateFailed(in string aFolderName); - void onlineFolderRename(in string oldName, in string newName); + void onlineFolderRename(in nsIMsgWindow msgWindow, in string oldName, in string newName); void folderIsNoSelect(in string aFolderName, out boolean aResult); void setFolderAdminURL(in string aFolderName, in string adminUrl); boolean folderVerifiedOnline(in string aFolderName); diff --git a/mailnews/imap/public/nsIImapService.idl b/mailnews/imap/public/nsIImapService.idl index 17fc3f1afdce..e77d7d48d407 100644 --- a/mailnews/imap/public/nsIImapService.idl +++ b/mailnews/imap/public/nsIImapService.idl @@ -162,7 +162,7 @@ interface nsIImapService : nsISupports in nsIUrlListener aUrlListener, out nsIURI aURL, in nsISupports aCopyState, - in nsIMsgWindow aWindow); + in nsIMsgWindow aWindow); void appendMessageFromFile(in nsIEventQueue aClientEventQueue, @@ -180,12 +180,14 @@ interface nsIImapService : nsISupports nsIURI moveFolder(in nsIEventQueue aClientEventQueue, in nsIMsgFolder aSrcFolder, in nsIMsgFolder aDstFolder, - in nsIUrlListener aUrlListener); + in nsIUrlListener aUrlListener, + in nsIMsgWindow msgWindow); nsIURI renameLeaf(in nsIEventQueue aClientEventQueue, in nsIMsgFolder aSrcFolder, in wstring aLeafName, - in nsIUrlListener aUrlListener); + in nsIUrlListener aUrlListener, + in nsIMsgWindow msgWindow); nsIURI deleteFolder(in nsIEventQueue aClientEventQueue, in nsIMsgFolder aFolder, diff --git a/mailnews/imap/public/nsIMsgImapMailFolder.idl b/mailnews/imap/public/nsIMsgImapMailFolder.idl index 5b9e09df32ea..cfcce14dbe29 100644 --- a/mailnews/imap/public/nsIMsgImapMailFolder.idl +++ b/mailnews/imap/public/nsIMsgImapMailFolder.idl @@ -35,7 +35,7 @@ interface nsIMsgImapMailFolder : nsISupports { void prepareToRename(); void performExpand(in nsIMsgWindow aMsgWindow); void recursiveCloseActiveConnections(in nsIImapIncomingServer aImapServer); - void renameClient(in nsIMsgFolder msgFolder, in string oldName, in string newName); + void renameClient(in nsIMsgWindow msgWindow, in nsIMsgFolder msgFolder, in string oldName, in string newName); // these are used for offline synchronization void storeImapFlags(in long flags, in boolean addFlags, out nsMsgKey keysToFlag, in long numKeys); diff --git a/mailnews/imap/src/nsImapIncomingServer.cpp b/mailnews/imap/src/nsImapIncomingServer.cpp index d34cfe0b4f9a..43b68c2751ae 100644 --- a/mailnews/imap/src/nsImapIncomingServer.cpp +++ b/mailnews/imap/src/nsImapIncomingServer.cpp @@ -1438,7 +1438,7 @@ NS_IMETHODIMP nsImapIncomingServer::OnlineFolderCreateFailed(const char *aFolde return NS_OK; } -NS_IMETHODIMP nsImapIncomingServer::OnlineFolderRename(const char *oldName, const char *newName) +NS_IMETHODIMP nsImapIncomingServer::OnlineFolderRename(nsIMsgWindow *msgWindow, const char *oldName, const char *newName) { nsresult rv = NS_ERROR_FAILURE; if (newName && *newName) @@ -1472,7 +1472,7 @@ NS_IMETHODIMP nsImapIncomingServer::OnlineFolderRename(const char *oldName, cons nsCOMPtr parentImapFolder = do_QueryInterface(parent); if (parentImapFolder) - parentImapFolder->RenameClient(me,oldName, newName); + parentImapFolder->RenameClient(msgWindow, me,oldName, newName); } } return rv; diff --git a/mailnews/imap/src/nsImapMailFolder.cpp b/mailnews/imap/src/nsImapMailFolder.cpp index 058dea325415..45d2d152f240 100644 --- a/mailnews/imap/src/nsImapMailFolder.cpp +++ b/mailnews/imap/src/nsImapMailFolder.cpp @@ -1215,7 +1215,7 @@ NS_IMETHODIMP nsImapMailFolder::Rename (const PRUnichar *newName, nsIMsgWindow * nsCOMPtr imapService(do_GetService(kCImapService, &rv)); if (NS_SUCCEEDED(rv)) - rv = imapService->RenameLeaf(m_eventQueue, this, newName, this, + rv = imapService->RenameLeaf(m_eventQueue, this, newName, this, msgWindow, nsnull); return rv; } @@ -2030,14 +2030,25 @@ nsImapMailFolder::DeleteSubFolders(nsISupportsArray* folders, nsIMsgWindow *msgW urlListener, nsnull); else - rv = imapService->MoveFolder(m_eventQueue, - curFolder, - trashFolder, - urlListener, - nsnull); + { + PRBool confirm = PR_FALSE; + PRBool match = PR_FALSE; + rv = curFolder->MatchOrChangeFilterDestination(nsnull, PR_FALSE, &match); + if (match) + { + curFolder->ConfirmFolderDeletionForFilter(msgWindow, &confirm); + if (!confirm) return NS_OK; + } + rv = imapService->MoveFolder(m_eventQueue, + curFolder, + trashFolder, + urlListener, + msgWindow, + nsnull); + } } } - } + } } } @@ -5262,16 +5273,28 @@ nsImapMailFolder::CopyFolder(nsIMsgFolder* srcFolder, if (isMoveFolder) //move folder permitted when dstFolder and the srcFolder are on same server { - nsCOMPtr imapService = do_GetService (kCImapService, &rv); - if (NS_SUCCEEDED(rv)) - { - nsCOMPtr urlListener = do_QueryInterface(srcFolder); - rv = imapService->MoveFolder(m_eventQueue, - srcFolder, - this, - urlListener, - nsnull); - } + nsCOMPtr imapService = do_GetService (kCImapService, &rv); + if (NS_SUCCEEDED(rv)) + { + nsCOMPtr urlListener = do_QueryInterface(srcFolder); + PRBool match = PR_FALSE; + PRBool confirmed = PR_FALSE; + if (mFlags & MSG_FOLDER_FLAG_TRASH) + { + rv = srcFolder->MatchOrChangeFilterDestination(nsnull, PR_FALSE, &match); + if (match) + { + srcFolder->ConfirmFolderDeletionForFilter(msgWindow, &confirmed); + if (!confirmed) return NS_OK; + } + } + rv = imapService->MoveFolder(m_eventQueue, + srcFolder, + this, + urlListener, + msgWindow, + nsnull); + } } else @@ -5642,7 +5665,7 @@ NS_IMETHODIMP nsImapMailFolder::PerformExpand(nsIMsgWindow *aMsgWindow) return rv; } -NS_IMETHODIMP nsImapMailFolder::RenameClient( nsIMsgFolder *msgFolder, const char* oldName, const char* newName ) +NS_IMETHODIMP nsImapMailFolder::RenameClient(nsIMsgWindow *msgWindow, nsIMsgFolder *msgFolder, const char* oldName, const char* newName ) { nsresult rv = NS_OK; nsCOMPtr pathSpec; @@ -5734,7 +5757,9 @@ NS_IMETHODIMP nsImapMailFolder::RenameClient( nsIMsgFolder *msgFolder, const cha folderInfo->SetMailboxName(&unicodeOnlineName); } PRBool changed = PR_FALSE; - msgFolder->ChangeFilterDestination(child, PR_FALSE /*caseInsensitive*/, &changed); + msgFolder->MatchOrChangeFilterDestination(child, PR_FALSE /*caseInsensitive*/, &changed); + if (changed) + msgFolder->AlertFilterChanged(msgWindow); } unusedDB->SetSummaryValid(PR_TRUE); unusedDB->Commit(nsMsgDBCommitType::kLargeCommit); @@ -5745,7 +5770,7 @@ NS_IMETHODIMP nsImapMailFolder::RenameClient( nsIMsgFolder *msgFolder, const cha if(childSupports && NS_SUCCEEDED(rv)) NotifyItemAdded(folderSupports, childSupports, "folderView"); - child->RenameSubFolders(msgFolder); + child->RenameSubFolders(msgWindow, msgFolder); } } @@ -5758,7 +5783,7 @@ NS_IMETHODIMP nsImapMailFolder::RenameClient( nsIMsgFolder *msgFolder, const cha return rv; } -NS_IMETHODIMP nsImapMailFolder::RenameSubFolders(nsIMsgFolder *oldFolder) +NS_IMETHODIMP nsImapMailFolder::RenameSubFolders(nsIMsgWindow *msgWindow, nsIMsgFolder *oldFolder) { nsresult rv = NS_OK; @@ -5841,14 +5866,15 @@ NS_IMETHODIMP nsImapMailFolder::RenameSubFolders(nsIMsgFolder *oldFolder) m_initialized = PR_TRUE; PRBool changed = PR_FALSE; - msgFolder->ChangeFilterDestination(child, PR_FALSE /*caseInsensitive*/, &changed); - + msgFolder->MatchOrChangeFilterDestination(child, PR_FALSE /*caseInsensitive*/, &changed); + if (changed) + msgFolder->AlertFilterChanged(msgWindow); nsCOMPtr parentSupport = do_QueryInterface(NS_STATIC_CAST(nsIMsgImapMailFolder*, this)); nsCOMPtr childSupport = do_QueryInterface(child); if (parentSupport && childSupport) NotifyItemAdded(parentSupport, childSupport, "folderView"); - child->RenameSubFolders(msgFolder); + child->RenameSubFolders(msgWindow, msgFolder); } rv = aEnumerator->Next(); diff --git a/mailnews/imap/src/nsImapMailFolder.h b/mailnews/imap/src/nsImapMailFolder.h index ef663c0bc969..43985568a7be 100644 --- a/mailnews/imap/src/nsImapMailFolder.h +++ b/mailnews/imap/src/nsImapMailFolder.h @@ -128,7 +128,7 @@ public: NS_IMETHOD EmptyTrash(nsIMsgWindow *msgWindow, nsIUrlListener *aListener); NS_IMETHOD Delete (); NS_IMETHOD Rename (const PRUnichar *newName, nsIMsgWindow *msgWindow); - NS_IMETHOD RenameSubFolders(nsIMsgFolder *oldFolder); + NS_IMETHOD RenameSubFolders(nsIMsgWindow *msgWindow, nsIMsgFolder *oldFolder); NS_IMETHOD GetNoSelect(PRBool *aResult); NS_IMETHOD GetPrettyName(PRUnichar ** prettyName); // Override of the base, for top-level mail folder diff --git a/mailnews/imap/src/nsImapProtocol.cpp b/mailnews/imap/src/nsImapProtocol.cpp index dec16a89fa06..bd965149e91d 100644 --- a/mailnews/imap/src/nsImapProtocol.cpp +++ b/mailnews/imap/src/nsImapProtocol.cpp @@ -5496,8 +5496,9 @@ void nsImapProtocol::FolderRenamed(const char *oldName, m_runningUrl->AllocateCanonicalPath(newName, onlineDelimiter, getter_Copies(canonicalNewName)); - - m_imapServerSink->OnlineFolderRename(canonicalOldName, canonicalNewName); + nsCOMPtr msgWindow; + GetMsgWindow(getter_AddRefs(msgWindow)); + m_imapServerSink->OnlineFolderRename(msgWindow, canonicalOldName, canonicalNewName); } } diff --git a/mailnews/imap/src/nsImapService.cpp b/mailnews/imap/src/nsImapService.cpp index 23baaa599556..1bea9ad2b48e 100644 --- a/mailnews/imap/src/nsImapService.cpp +++ b/mailnews/imap/src/nsImapService.cpp @@ -2308,8 +2308,8 @@ nsImapService::GetImapConnectionAndLoadUrl(nsIEventQueue* aClientEventQueue, NS_IMETHODIMP nsImapService::MoveFolder(nsIEventQueue* eventQueue, nsIMsgFolder* srcFolder, - nsIMsgFolder* dstFolder, - nsIUrlListener* urlListener, nsIURI** url) + nsIMsgFolder* dstFolder, nsIUrlListener* urlListener, + nsIMsgWindow *msgWindow, nsIURI** url) { NS_ASSERTION(eventQueue && srcFolder && dstFolder, "Oops ... null pointer"); @@ -2327,6 +2327,9 @@ nsImapService::MoveFolder(nsIEventQueue* eventQueue, nsIMsgFolder* srcFolder, rv = SetImapUrlSink(dstFolder, imapUrl); if (NS_SUCCEEDED(rv)) { + nsCOMPtr mailNewsUrl = do_QueryInterface(imapUrl); + if (mailNewsUrl) + mailNewsUrl->SetMsgWindow(msgWindow); char hierarchySeparator = kOnlineHierarchySeparatorUnknown; nsXPIDLCString folderName; @@ -2359,7 +2362,7 @@ nsImapService::MoveFolder(nsIEventQueue* eventQueue, nsIMsgFolder* srcFolder, NS_IMETHODIMP nsImapService::RenameLeaf(nsIEventQueue* eventQueue, nsIMsgFolder* srcFolder, const PRUnichar* newLeafName, nsIUrlListener* urlListener, - nsIURI** url) + nsIMsgWindow *msgWindow, nsIURI** url) { NS_ASSERTION(eventQueue && srcFolder && newLeafName && *newLeafName, "Oops ... [RenameLeaf] null pointers"); @@ -2378,7 +2381,9 @@ nsImapService::RenameLeaf(nsIEventQueue* eventQueue, nsIMsgFolder* srcFolder, if (NS_SUCCEEDED(rv)) { nsCOMPtr uri = do_QueryInterface(imapUrl); - + nsCOMPtr mailNewsUrl = do_QueryInterface(imapUrl); + if (mailNewsUrl) + mailNewsUrl->SetMsgWindow(msgWindow); nsXPIDLCString folderName; GetFolderName(srcFolder, getter_Copies(folderName)); urlSpec.Append("/rename>"); diff --git a/mailnews/local/public/nsIMsgLocalMailFolder.idl b/mailnews/local/public/nsIMsgLocalMailFolder.idl index 0e449d09b36c..3cf5f6ddc627 100644 --- a/mailnews/local/public/nsIMsgLocalMailFolder.idl +++ b/mailnews/local/public/nsIMsgLocalMailFolder.idl @@ -24,6 +24,8 @@ interface nsIMsgWindow; interface nsIUrlListener; interface nsIMsgDatabase; +interface nsIMsgFolder; +interface nsIMsgCopyServiceListener; [scriptable, uuid(27D2DE40-BAF1-11d2-9578-00805F8AC615)] interface nsIMsgLocalMailFolder : nsISupports { @@ -37,6 +39,8 @@ interface nsIMsgLocalMailFolder : nsISupports { void setFlagsOnDefaultMailboxes(in unsigned long flags); nsIMsgDatabase getDatabaseWOReparse(); void parseFolder(in nsIMsgWindow aMsgWindow, in nsIUrlListener listener); + void copyFolderLocal(in nsIMsgFolder srcFolder, in boolean isMove, in nsIMsgWindow msgWindow, in nsIMsgCopyServiceListener listener ); + void doNextSubFolder(in nsIMsgFolder srcFolder, in nsIMsgWindow msgWindow, in nsIMsgCopyServiceListener listener ); readonly attribute boolean parsingInbox; attribute boolean checkForNewMessagesAfterParsing; }; diff --git a/mailnews/local/src/nsLocalMailFolder.cpp b/mailnews/local/src/nsLocalMailFolder.cpp index de15f34a1588..13956f7be661 100644 --- a/mailnews/local/src/nsLocalMailFolder.cpp +++ b/mailnews/local/src/nsLocalMailFolder.cpp @@ -992,8 +992,6 @@ NS_IMETHODIMP nsMsgLocalMailFolder::EmptyTrash(nsIMsgWindow *msgWindow, parentFolder->CreateSubfolder(folderName.get(),nsnull); nsCOMPtr newTrashFolder; rv = GetTrashFolder(getter_AddRefs(newTrashFolder)); - db=nsnull; - dbFolderInfo=nsnull; if (NS_SUCCEEDED(rv) && newTrashFolder) newTrashFolder->GetMsgDatabase(msgWindow, getter_AddRefs(db)); @@ -1281,7 +1279,9 @@ NS_IMETHODIMP nsMsgLocalMailFolder::Rename(const PRUnichar *aNewName, nsIMsgWind { newFolder->SetName(newFolderName.get()); PRBool changed = PR_FALSE; - ChangeFilterDestination(newFolder, PR_TRUE /*caseInsenstive*/, &changed); + MatchOrChangeFilterDestination(newFolder, PR_TRUE /*caseInsenstive*/, &changed); + if (changed) + AlertFilterChanged(msgWindow); nsCOMPtr newFolderSupport = do_QueryInterface(newFolder); NotifyItemAdded(parentSupport, newFolderSupport, "folderView"); /***** jefft - @@ -1289,7 +1289,7 @@ NS_IMETHODIMP nsMsgLocalMailFolder::Rename(const PRUnichar *aNewName, nsIMsgWind * message being selected. */ if (cnt > 0) - newFolder->RenameSubFolders(this); + newFolder->RenameSubFolders(msgWindow, this); if (parentFolder) { SetParent(nsnull); @@ -1300,7 +1300,7 @@ NS_IMETHODIMP nsMsgLocalMailFolder::Rename(const PRUnichar *aNewName, nsIMsgWind return rv; } -NS_IMETHODIMP nsMsgLocalMailFolder::RenameSubFolders(nsIMsgFolder *oldFolder) +NS_IMETHODIMP nsMsgLocalMailFolder::RenameSubFolders(nsIMsgWindow *msgWindow, nsIMsgFolder *oldFolder) { nsresult rv =NS_OK; mInitialized = PR_TRUE; @@ -1326,14 +1326,16 @@ NS_IMETHODIMP nsMsgLocalMailFolder::RenameSubFolders(nsIMsgFolder *oldFolder) { newFolder->SetName(folderName); PRBool changed = PR_FALSE; - msgFolder->ChangeFilterDestination(newFolder, PR_TRUE /*caseInsenstive*/, &changed); + msgFolder->MatchOrChangeFilterDestination(newFolder, PR_TRUE /*caseInsenstive*/, &changed); + if (changed) + msgFolder->AlertFilterChanged(msgWindow); nsCOMPtr parentSupport = do_QueryInterface(NS_STATIC_CAST(nsIMsgLocalMailFolder*, this)); nsCOMPtr newFolderSupport = do_QueryInterface(newFolder); if (parentSupport && newFolderSupport) NotifyItemAdded(parentSupport, newFolderSupport, "folderView"); - newFolder->RenameSubFolders(msgFolder); + newFolder->RenameSubFolders(msgWindow, msgFolder); } rv = aEnumerator->Next(); } @@ -1828,22 +1830,22 @@ nsMsgLocalMailFolder::CopyMessages(nsIMsgFolder* srcFolder, nsISupportsArray* } // for srcFolder that are on different server than the dstFolder. nsresult -nsMsgLocalMailFolder::CopyFolderAcrossServer(nsIMsgFolder *destFolder, nsIMsgFolder* srcFolder, nsIMsgWindow *msgWindow, +nsMsgLocalMailFolder::CopyFolderAcrossServer(nsIMsgFolder* srcFolder, nsIMsgWindow *msgWindow, nsIMsgCopyServiceListener *listener ) { nsresult rv; + mInitialized = PR_TRUE; nsCOMPtr newFolder; nsCOMPtr newMsgFolder; nsXPIDLString folderName; srcFolder->GetName(getter_Copies(folderName)); - rv = destFolder->CreateSubfolder(folderName,msgWindow); + rv = CreateSubfolder(folderName,msgWindow); if (NS_FAILED(rv)) return rv; - destFolder->FindSubFolder(NS_ConvertUCS2toUTF8(folderName.get()).get(), getter_AddRefs(newFolder)); - + FindSubFolder(NS_ConvertUCS2toUTF8(folderName.get()).get(), getter_AddRefs(newFolder)); newMsgFolder = do_QueryInterface(newFolder,&rv); nsCOMPtr messages; @@ -1869,18 +1871,20 @@ nsMsgLocalMailFolder::CopyFolderAcrossServer(nsIMsgFolder *destFolder, nsIMsgFol msgSupportsArray->Count(&numMsgs); if (numMsgs > 0 ) //if only srcFolder has messages.. - newMsgFolder->CopyMessages(srcFolder, msgSupportsArray, PR_FALSE, msgWindow, listener, PR_TRUE /* is folder*/, PR_FALSE /* allowUndo */); + newMsgFolder->CopyMessages(srcFolder, msgSupportsArray, PR_FALSE, msgWindow, listener, PR_TRUE /* is folder*/, PR_FALSE /* allowUndo */); else - DoNextSubFolder(newMsgFolder, srcFolder, msgWindow, listener); - + { + nsCOMPtr localFolder = do_QueryInterface(newMsgFolder); + if (localFolder) + localFolder->DoNextSubFolder(srcFolder, msgWindow, listener); + } return NS_OK; // otherwise the front-end will say Exception::CopyFolder } nsresult //Continue with next subfolder -nsMsgLocalMailFolder::DoNextSubFolder(nsIMsgFolder *newMsgFolder, - nsIMsgFolder *srcFolder, - nsIMsgWindow *msgWindow, - nsIMsgCopyServiceListener *listener ) +nsMsgLocalMailFolder::DoNextSubFolder(nsIMsgFolder *srcFolder, + nsIMsgWindow *msgWindow, + nsIMsgCopyServiceListener *listener ) { nsresult rv; nsCOMPtr aEnumerator; @@ -1892,9 +1896,9 @@ nsMsgLocalMailFolder::DoNextSubFolder(nsIMsgFolder *newMsgFolder, { rv = aEnumerator->CurrentItem(getter_AddRefs(aSupports)); folder = do_QueryInterface(aSupports); - rv = aEnumerator->Next(); + rv = aEnumerator->Next(); if (folder) - CopyFolderAcrossServer(newMsgFolder,folder, msgWindow, listener); + CopyFolderAcrossServer(folder, msgWindow, listener); } return rv; @@ -1909,23 +1913,36 @@ nsMsgLocalMailFolder::CopyFolder( nsIMsgFolder* srcFolder, PRBool isMoveFolder, NS_ENSURE_ARG_POINTER(srcFolder); if (isMoveFolder) // isMoveFolder == true when "this" and srcFolder are on same server - rv = CopyFolderLocal(this, srcFolder, isMoveFolder, msgWindow, listener ); + rv = CopyFolderLocal(srcFolder, isMoveFolder, msgWindow, listener ); else - rv = CopyFolderAcrossServer(this, srcFolder, msgWindow, listener ); + rv = CopyFolderAcrossServer(srcFolder, msgWindow, listener ); return rv; } - -nsresult -nsMsgLocalMailFolder::CopyFolderLocal( nsIMsgFolder *destFolder, nsIMsgFolder *srcFolder, PRBool isMoveFolder, +NS_IMETHODIMP +nsMsgLocalMailFolder::CopyFolderLocal(nsIMsgFolder *srcFolder, PRBool isMoveFolder, nsIMsgWindow *msgWindow, nsIMsgCopyServiceListener *listener ) { nsresult rv; + mInitialized = PR_TRUE; nsCOMPtr newFolder; nsCOMPtr newMsgFolder; + PRBool isChildOfTrash=PR_FALSE; + rv = IsChildOfTrash(&isChildOfTrash); + if (isChildOfTrash) + { + PRBool match = PR_FALSE; + PRBool confirmed = PR_FALSE; + rv = srcFolder->MatchOrChangeFilterDestination(nsnull, PR_FALSE, &match); + if (match) + { + srcFolder->ConfirmFolderDeletionForFilter(msgWindow, &confirmed); + if (!confirmed) return NS_MSG_ERROR_COPY_FOLDER_ABORTED; + } + } nsXPIDLString idlName; srcFolder->GetName(getter_Copies(idlName)); @@ -1945,7 +1962,7 @@ nsMsgLocalMailFolder::CopyFolderLocal( nsIMsgFolder *destFolder, nsIMsgFolder *s nsLocalFolderSummarySpec summarySpec(oldPath); nsCOMPtr newPathSpec; - rv = destFolder->GetPath(getter_AddRefs(newPathSpec)); + rv = GetPath(getter_AddRefs(newPathSpec)); NS_ENSURE_SUCCESS(rv,rv); nsFileSpec newPath; @@ -1963,61 +1980,68 @@ nsMsgLocalMailFolder::CopyFolderLocal( nsIMsgFolder *destFolder, nsIMsgFolder *s nsFileSpec path = oldPath; - path.MoveToDir(newPath); - summarySpec.MoveToDir(newPath); + path.CopyToDir(newPath); //necessary for aborting.... + summarySpec.CopyToDir(newPath); - destFolder->AddSubfolder(&folderName, getter_AddRefs(newMsgFolder)); + AddSubfolder(&folderName, getter_AddRefs(newMsgFolder)); PRUint32 flags; srcFolder->GetFlags(&flags); newMsgFolder->SetFlags(flags); PRBool changed = PR_FALSE; - rv = srcFolder->ChangeFilterDestination(newMsgFolder, PR_TRUE, &changed); - + rv = srcFolder->MatchOrChangeFilterDestination(newMsgFolder, PR_TRUE, &changed); + if (changed) + srcFolder->AlertFilterChanged(msgWindow); if (newMsgFolder) { newMsgFolder->SetName(folderName.get()); nsCOMPtr supports = do_QueryInterface(newMsgFolder); - nsCOMPtr parentSupports = do_QueryInterface(destFolder); + nsCOMPtr parentSupports = do_QueryInterface((nsIMsgLocalMailFolder*)this); if (supports && parentSupports) { NotifyItemAdded(parentSupports, supports, "folderView"); } } - + nsCOMPtr aEnumerator; srcFolder->GetSubFolders(getter_AddRefs(aEnumerator)); nsCOMPtrfolder; nsCOMPtr supports; rv = aEnumerator->First(); + nsresult copyStatus = NS_OK; while (NS_SUCCEEDED(rv)) { - rv = aEnumerator->CurrentItem(getter_AddRefs(supports)); - folder = do_QueryInterface(supports); - rv = aEnumerator->Next(); - if (folder) - CopyFolderLocal(newMsgFolder,folder, PR_FALSE, msgWindow, listener); // PR_FALSE needed to avoid un-necessary deletions - + rv = aEnumerator->CurrentItem(getter_AddRefs(supports)); + folder = do_QueryInterface(supports); + rv = aEnumerator->Next(); + if (folder) + { + nsCOMPtr localFolder = do_QueryInterface(newMsgFolder); + if (localFolder) + copyStatus = localFolder->CopyFolderLocal(folder, PR_FALSE, msgWindow, listener); // PR_FALSE needed to avoid un-necessary deletions + } } - if (isMoveFolder ) + if (isMoveFolder && NS_SUCCEEDED(copyStatus)) { nsCOMPtr parent; nsCOMPtr msgParent; srcFolder->GetParent(getter_AddRefs(parent)); - srcFolder->SetParent(nsnull); + srcFolder->SetParent(nsnull); if (parent) - { - msgParent = do_QueryInterface(parent); - if (msgParent) - msgParent->PropagateDelete(srcFolder, PR_FALSE, msgWindow); // The files have already been moved, so delete storage PR_FALSE - if (!oldPath.IsDirectory()) { - AddDirectorySeparator(oldPath); - oldPath.Delete(PR_TRUE); //delete the .sbd directory and it's content. All subfolders have been moved + msgParent = do_QueryInterface(parent); + if (msgParent) + msgParent->PropagateDelete(srcFolder, PR_FALSE, msgWindow); // The files have already been moved, so delete storage PR_FALSE + oldPath.Delete(PR_TRUE); //berkeley mailbox + summarySpec.Delete(PR_TRUE); //msf file + if (!oldPath.IsDirectory()) + { + AddDirectorySeparator(oldPath); + oldPath.Delete(PR_TRUE); //delete the .sbd directory and it's content. All subfolders have been moved + } } - } } return NS_OK; @@ -2500,7 +2524,7 @@ NS_IMETHODIMP nsMsgLocalMailFolder::EndCopy(PRBool copySucceeded) nsCOMPtr srcFolder; srcFolder = do_QueryInterface(mCopyState->m_srcSupport); if (mCopyState->m_isFolder) - DoNextSubFolder(this, srcFolder, nsnull, nsnull); //Copy all subfolders then notify completion + DoNextSubFolder(srcFolder, nsnull, nsnull); //Copy all subfolders then notify completion nsCOMPtr copyService = do_GetService(kMsgCopyServiceCID, &result); diff --git a/mailnews/local/src/nsLocalMailFolder.h b/mailnews/local/src/nsLocalMailFolder.h index 8385a71a1667..76d14f5aa9fb 100644 --- a/mailnews/local/src/nsLocalMailFolder.h +++ b/mailnews/local/src/nsLocalMailFolder.h @@ -118,7 +118,7 @@ public: NS_IMETHOD DeleteSubFolders(nsISupportsArray *folders, nsIMsgWindow *msgWindow); NS_IMETHOD CreateStorageIfMissing(nsIUrlListener* urlListener); NS_IMETHOD Rename (const PRUnichar *aNewName, nsIMsgWindow *msgWindow); - NS_IMETHOD RenameSubFolders (nsIMsgFolder *oldFolder); + NS_IMETHOD RenameSubFolders (nsIMsgWindow *msgWindow, nsIMsgFolder *oldFolder); NS_IMETHOD GetPrettyName(PRUnichar** prettyName); // Override of the base, for top-level mail folder @@ -153,14 +153,8 @@ public: NS_IMETHOD GetNewMessages(nsIMsgWindow *aWindow, nsIUrlListener *aListener); NS_IMETHOD NotifyCompactCompleted(); - protected: - nsresult CopyFolderLocal(nsIMsgFolder *destFolder, nsIMsgFolder *srcFolder, PRBool isMoveFolder, nsIMsgWindow *msgWindow, - nsIMsgCopyServiceListener* listener); - nsresult CopyFolderAcrossServer(nsIMsgFolder *destFolder, nsIMsgFolder *srcFolder, nsIMsgWindow *msgWindow,nsIMsgCopyServiceListener* listener); - - nsresult DoNextSubFolder(nsIMsgFolder *newMsgFolder, nsIMsgFolder *srcFolder, - nsIMsgWindow *msgWindow, nsIMsgCopyServiceListener *listener ); + nsresult CopyFolderAcrossServer(nsIMsgFolder *srcFolder, nsIMsgWindow *msgWindow,nsIMsgCopyServiceListener* listener); nsresult CreateSubFolders(nsFileSpec &path); nsresult AddDirectorySeparator(nsFileSpec &path);