зеркало из https://github.com/mozilla/gecko-dev.git
93968 100037 r=bienvenu sr=sspitzer. Ask for confirmation dialog for folders that have an
associated filter and warn user if folder is renamed/deleted/moved. Also fixed some of D&D folder problems and cleaned up the stringBundle code in base/util.
This commit is contained in:
Родитель
212d1b132a
Коммит
2697a939d7
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<nsIDocShell> 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<nsIStringBundleService> bundleService =
|
||||
do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
nsCOMPtr<nsIStringBundle> 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<nsIPrompt> dialog(do_GetInterface(docShell));
|
||||
if (dialog && alertString)
|
||||
{
|
||||
PRBool okToCompact = PR_FALSE;
|
||||
dialog->Confirm(nsnull, alertString.get(), &okToCompact);
|
||||
if (okToCompact)
|
||||
{
|
||||
if ( localExpungedBytes > 0)
|
||||
{
|
||||
nsCOMPtr <nsISupports> aSupports = getter_AddRefs(folderArray->ElementAt(0));
|
||||
nsCOMPtr <nsIMsgFolder> 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 <nsISupports> aSupports = getter_AddRefs(folderArray->ElementAt(0));
|
||||
nsCOMPtr <nsIMsgFolder> 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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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<nsIStringBundleService> bundleService =
|
||||
do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv);
|
||||
nsCOMPtr<nsIStringBundle> 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 <nsIStringBundle> 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 <nsIDocShell> docShell;
|
||||
msgWindow->GetRootDocShell(getter_AddRefs(docShell));
|
||||
nsCOMPtr<nsIStringBundleService> bundleService =
|
||||
do_GetService(NS_STRINGBUNDLE_CONTRACTID);
|
||||
if (bundleService)
|
||||
if (docShell)
|
||||
{
|
||||
nsCOMPtr<nsIStringBundle> 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<nsIPrompt> dialog(do_GetInterface(docShell));
|
||||
if (dialog && alertString)
|
||||
{
|
||||
dialog->Alert(nsnull, alertString);
|
||||
nsTextFormatter::smprintf_free(alertString);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
nsCOMPtr<nsIPrompt> dialog(do_GetInterface(docShell));
|
||||
if (dialog && confirmString)
|
||||
dialog->Confirm(nsnull, confirmString, confirmed);
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP nsMsgFolder::ConfirmFolderDeletionForFilter(nsIMsgWindow *msgWindow, PRBool *confirmed)
|
||||
{
|
||||
nsCOMPtr <nsIStringBundle> 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 <nsIDocShell> 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<nsIPrompt> 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<nsIPref> 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<nsIPref> 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");
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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<nsIMsgImapMailFolder> parentImapFolder = do_QueryInterface(parent);
|
||||
if (parentImapFolder)
|
||||
parentImapFolder->RenameClient(me,oldName, newName);
|
||||
parentImapFolder->RenameClient(msgWindow, me,oldName, newName);
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
|
|
|
@ -1215,7 +1215,7 @@ NS_IMETHODIMP nsImapMailFolder::Rename (const PRUnichar *newName, nsIMsgWindow *
|
|||
|
||||
nsCOMPtr<nsIImapService> 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 <nsIImapService> imapService = do_GetService (kCImapService, &rv);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
nsCOMPtr <nsIUrlListener> urlListener = do_QueryInterface(srcFolder);
|
||||
rv = imapService->MoveFolder(m_eventQueue,
|
||||
srcFolder,
|
||||
this,
|
||||
urlListener,
|
||||
nsnull);
|
||||
}
|
||||
nsCOMPtr <nsIImapService> imapService = do_GetService (kCImapService, &rv);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
nsCOMPtr <nsIUrlListener> 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<nsIFileSpec> 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 <nsISupports> parentSupport = do_QueryInterface(NS_STATIC_CAST(nsIMsgImapMailFolder*, this));
|
||||
nsCOMPtr <nsISupports> childSupport = do_QueryInterface(child);
|
||||
if (parentSupport && childSupport)
|
||||
NotifyItemAdded(parentSupport, childSupport, "folderView");
|
||||
|
||||
child->RenameSubFolders(msgFolder);
|
||||
child->RenameSubFolders(msgWindow, msgFolder);
|
||||
}
|
||||
rv = aEnumerator->Next();
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -5496,8 +5496,9 @@ void nsImapProtocol::FolderRenamed(const char *oldName,
|
|||
m_runningUrl->AllocateCanonicalPath(newName,
|
||||
onlineDelimiter,
|
||||
getter_Copies(canonicalNewName));
|
||||
|
||||
m_imapServerSink->OnlineFolderRename(canonicalOldName, canonicalNewName);
|
||||
nsCOMPtr<nsIMsgWindow> msgWindow;
|
||||
GetMsgWindow(getter_AddRefs(msgWindow));
|
||||
m_imapServerSink->OnlineFolderRename(msgWindow, canonicalOldName, canonicalNewName);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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<nsIMsgMailNewsUrl> 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<nsIURI> uri = do_QueryInterface(imapUrl);
|
||||
|
||||
nsCOMPtr<nsIMsgMailNewsUrl> mailNewsUrl = do_QueryInterface(imapUrl);
|
||||
if (mailNewsUrl)
|
||||
mailNewsUrl->SetMsgWindow(msgWindow);
|
||||
nsXPIDLCString folderName;
|
||||
GetFolderName(srcFolder, getter_Copies(folderName));
|
||||
urlSpec.Append("/rename>");
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -992,8 +992,6 @@ NS_IMETHODIMP nsMsgLocalMailFolder::EmptyTrash(nsIMsgWindow *msgWindow,
|
|||
parentFolder->CreateSubfolder(folderName.get(),nsnull);
|
||||
nsCOMPtr<nsIMsgFolder> 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<nsISupports> 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 <nsISupports> parentSupport = do_QueryInterface(NS_STATIC_CAST(nsIMsgLocalMailFolder*, this));
|
||||
nsCOMPtr <nsISupports> 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<nsIFolder> newFolder;
|
||||
nsCOMPtr<nsIMsgFolder> 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<nsISimpleEnumerator> 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 <nsIMsgLocalMailFolder> 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<nsIEnumerator> 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<nsIFolder> newFolder;
|
||||
nsCOMPtr<nsIMsgFolder> 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<nsIFileSpec> 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<nsISupports> supports = do_QueryInterface(newMsgFolder);
|
||||
nsCOMPtr<nsISupports> parentSupports = do_QueryInterface(destFolder);
|
||||
nsCOMPtr <nsISupports> parentSupports = do_QueryInterface((nsIMsgLocalMailFolder*)this);
|
||||
|
||||
if (supports && parentSupports)
|
||||
{
|
||||
NotifyItemAdded(parentSupports, supports, "folderView");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
nsCOMPtr<nsIEnumerator> aEnumerator;
|
||||
srcFolder->GetSubFolders(getter_AddRefs(aEnumerator));
|
||||
nsCOMPtr<nsIMsgFolder>folder;
|
||||
nsCOMPtr<nsISupports> 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 <nsIMsgLocalMailFolder> 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 <nsIFolder> parent;
|
||||
nsCOMPtr<nsIMsgFolder> 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<nsIMsgFolder> 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<nsIMsgCopyService> copyService =
|
||||
do_GetService(kMsgCopyServiceCID, &result);
|
||||
|
|
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче