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:
naving%netscape.com 2001-09-27 02:47:03 +00:00
Родитель 212d1b132a
Коммит 2697a939d7
20 изменённых файлов: 320 добавлений и 190 удалений

Просмотреть файл

@ -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
{
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
{
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,27 +1435,11 @@ nsMsgDBFolder::AutoCompact(nsIMsgWindow *aWindow)
NS_ENSURE_SUCCESS(rv, rv);
if (totalExpungedBytes > (purgeThreshold*1024))
{
nsCOMPtr<nsIDocShell> docShell;
if (aWindow)
{
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)
{
nsCOMPtr<nsIPrompt> dialog(do_GetInterface(docShell));
if (dialog && alertString)
{
nsXPIDLString confirmString;
PRBool okToCompact = PR_FALSE;
dialog->Confirm(nsnull, alertString.get(), &okToCompact);
rv = GetStringFromBundle("autoCompactAllFolders", getter_Copies(confirmString));
if (NS_SUCCEEDED(rv) && confirmString)
ThrowConfirmationPrompt(aWindow, confirmString.get(), &okToCompact);
if (okToCompact)
{
if ( localExpungedBytes > 0)
@ -1475,9 +1458,6 @@ nsMsgDBFolder::AutoCompact(nsIMsgWindow *aWindow)
}
}
}
}
}
}
gtimeOfLastPurgeCheck = PR_Now();
}
return rv;
@ -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)
{
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)
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)
{
dialog->Alert(nsnull, alertString);
nsTextFormatter::smprintf_free(alertString);
}
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);

Просмотреть файл

@ -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,16 +2030,27 @@ nsImapMailFolder::DeleteSubFolders(nsISupportsArray* folders, nsIMsgWindow *msgW
urlListener,
nsnull);
else
{
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);
}
}
}
}
}
}
if (confirmed && deleteNoTrash) //delete subfolders only if you are deleting things from trash
return nsMsgFolder::DeleteSubFolders(folders, msgWindow);
@ -5266,10 +5277,22 @@ nsImapMailFolder::CopyFolder(nsIMsgFolder* srcFolder,
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);
}
@ -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;
@ -1871,14 +1873,16 @@ nsMsgLocalMailFolder::CopyFolderAcrossServer(nsIMsgFolder *destFolder, nsIMsgFol
if (numMsgs > 0 ) //if only srcFolder has messages..
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,
nsMsgLocalMailFolder::DoNextSubFolder(nsIMsgFolder *srcFolder,
nsIMsgWindow *msgWindow,
nsIMsgCopyServiceListener *listener )
{
@ -1894,7 +1898,7 @@ nsMsgLocalMailFolder::DoNextSubFolder(nsIMsgFolder *newMsgFolder,
folder = do_QueryInterface(aSupports);
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,22 +1980,23 @@ 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)
{
@ -1991,17 +2009,21 @@ nsMsgLocalMailFolder::CopyFolderLocal( nsIMsgFolder *destFolder, nsIMsgFolder *s
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
{
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;
@ -2012,6 +2034,8 @@ nsMsgLocalMailFolder::CopyFolderLocal( nsIMsgFolder *destFolder, nsIMsgFolder *s
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);
@ -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);