From 85851d5ce959850fff8821c6f03ce4c906b41487 Mon Sep 17 00:00:00 2001 From: "bugzilla%standard8.plus.com" Date: Wed, 16 Apr 2008 11:49:58 +0000 Subject: [PATCH] Part of Bug 420614 - move imap mail folder calls from GetSubFoldersObsolete to GetSubFolders. r/sr=Neil git-svn-id: svn://10.0.0.236/trunk@250296 18797224-902f-48f8-a5cc-f745e15eee43 --- .../mailnews/imap/src/nsImapMailFolder.cpp | 167 ++++++++++-------- 1 file changed, 95 insertions(+), 72 deletions(-) diff --git a/mozilla/mailnews/imap/src/nsImapMailFolder.cpp b/mozilla/mailnews/imap/src/nsImapMailFolder.cpp index 0d067b92cb3..02840b67019 100644 --- a/mozilla/mailnews/imap/src/nsImapMailFolder.cpp +++ b/mozilla/mailnews/imap/src/nsImapMailFolder.cpp @@ -1310,41 +1310,48 @@ NS_IMETHODIMP nsImapMailFolder::EmptyTrash(nsIMsgWindow *aMsgWindow, nsIUrlListe rv = trashFolder->GetHasSubFolders(&hasSubfolders); if (hasSubfolders) { - nsCOMPtr enumerator; - nsCOMPtr aSupport; - nsCOMPtr aFolder; - nsCOMPtr aSupportsArray = do_CreateInstance(NS_SUPPORTSARRAY_CONTRACTID, &rv); - NS_ENSURE_TRUE(aSupportsArray, rv); - rv = trashFolder->GetSubFoldersObsolete(getter_AddRefs(enumerator)); PRBool confirmDeletion; nsCOMPtr prefBranch(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); NS_ENSURE_SUCCESS(rv, rv); + prefBranch->GetBoolPref("mail.imap.confirm_emptyTrashFolderDeletion", &confirmDeletion); - nsString confirmationStr; - nsCOMPtr bundle; - nsCOMPtr parentWindow; - nsCOMPtr promptService; + if (confirmDeletion) { - IMAPGetStringByID(IMAP_EMPTY_TRASH_CONFIRM, getter_Copies(confirmationStr)); - promptService = do_GetService(NS_PROMPTSERVICE_CONTRACTID); - nsCOMPtr docShell; + nsCOMPtr enumerator; + rv = trashFolder->GetSubFolders(getter_AddRefs(enumerator)); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr promptService(do_GetService(NS_PROMPTSERVICE_CONTRACTID, &rv)); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr parentWindow; if (aMsgWindow) { + nsCOMPtr docShell; (void) aMsgWindow->GetRootDocShell(getter_AddRefs(docShell)); parentWindow = do_QueryInterface(docShell); } + + nsCOMPtr bundle; rv = IMAPGetStringBundle(getter_AddRefs(bundle)); NS_ENSURE_SUCCESS(rv, rv); - rv = enumerator->First(); - while(NS_SUCCEEDED(rv)) + + PRBool hasMore; + while (NS_SUCCEEDED(enumerator->HasMoreElements(&hasMore)) && hasMore) { - PRInt32 dlgResult = -1; - rv = enumerator->CurrentItem(getter_AddRefs(aSupport)); + PRInt32 dlgResult = -1; + nsCOMPtr item; + rv = enumerator->GetNext(getter_AddRefs(item)); + if (NS_FAILED(rv)) + continue; + if (confirmDeletion) { + nsCOMPtr folder(do_QueryInterface(item, &rv)); + if (NS_FAILED(rv)) + continue; nsString confirmText; - nsCOMPtr folder = do_QueryInterface(aSupport); nsString folderName; folder->GetName(folderName); const PRUnichar *formatStrings[1] = { folderName.get() }; @@ -1357,12 +1364,8 @@ NS_IMETHODIMP nsImapMailFolder::EmptyTrash(nsIMsgWindow *aMsgWindow, nsIUrlListe (nsIPromptService::BUTTON_TITLE_CANCEL * nsIPromptService::BUTTON_POS_1), nsnull, nsnull, nsnull, nsnull, nsnull, &dlgResult); } - if ( NS_SUCCEEDED(rv)) - { - if (dlgResult == 1) - return NS_BINDING_ABORTED; - rv = enumerator->Next(); - } + if (NS_SUCCEEDED(rv) && dlgResult == 1) + return NS_BINDING_ABORTED; } } } @@ -1377,29 +1380,32 @@ NS_IMETHODIMP nsImapMailFolder::EmptyTrash(nsIMsgWindow *aMsgWindow, nsIUrlListe // to know if this fails so that it doesn't block waiting for empty trash to finish. if (NS_FAILED(rv)) return rv; + if (hasSubfolders) { - nsCOMPtr enumerator; - nsCOMPtr aSupport; - nsCOMPtr aFolder; - nsCOMPtr aSupportsArray = do_CreateInstance(NS_SUPPORTSARRAY_CONTRACTID, &rv); - NS_ENSURE_TRUE(aSupportsArray, rv); - rv = trashFolder->GetSubFoldersObsolete(getter_AddRefs(enumerator)); - rv = enumerator->First(); - while(NS_SUCCEEDED(rv)) + nsCOMPtr enumerator; + nsCOMPtr item; + nsCOMArray array; + + rv = trashFolder->GetSubFolders(getter_AddRefs(enumerator)); + NS_ENSURE_SUCCESS(rv, rv); + + PRBool hasMore; + while (NS_SUCCEEDED(enumerator->HasMoreElements(&hasMore)) && hasMore) { - enumerator->CurrentItem(getter_AddRefs(aSupport)); - aSupportsArray->AppendElement(aSupport); - rv = enumerator->Next(); + rv = enumerator->GetNext(getter_AddRefs(item)); + if (NS_SUCCEEDED(rv)) + { + nsCOMPtr folder(do_QueryInterface(item, &rv)); + if (NS_SUCCEEDED(rv)) + array.AppendObject(folder); + } } - PRUint32 cnt = 0; - aSupportsArray->Count(&cnt); - for (PRInt32 i = cnt - 1; i >= 0; i--) + for (PRInt32 i = array.Count() - 1; i >= 0; i--) { - aFolder = do_QueryElementAt(aSupportsArray, i); - aSupportsArray->RemoveElementAt(i); - if (aFolder) - trashFolder->PropagateDelete(aFolder, PR_TRUE, aMsgWindow); + trashFolder->PropagateDelete(array[i], PR_TRUE, aMsgWindow); + // Remove the object, presumably to free it up before we delete the next. + array.RemoveObjectAt(i); } } return NS_OK; @@ -7106,19 +7112,25 @@ NS_IMETHODIMP nsImapMailFolder::ResetNamespaceReferences() m_folderIsNamespace = m_namespace ? nsIMAPNamespaceList::GetFolderIsNamespace(serverKey.get(), onlineName.get(), (char) hierarchyDelimiter, m_namespace) : PR_FALSE; - nsCOMPtr enumerator; - GetSubFoldersObsolete(getter_AddRefs(enumerator)); + nsCOMPtr enumerator; + GetSubFolders(getter_AddRefs(enumerator)); if (!enumerator) return NS_OK; - nsCOMPtr aSupport; - nsresult rv = enumerator->First(); - while (NS_SUCCEEDED(rv)) + + nsresult rv; + PRBool hasMore; + while (NS_SUCCEEDED(enumerator->HasMoreElements(&hasMore)) && hasMore) { - rv = enumerator->CurrentItem(getter_AddRefs(aSupport)); - nsCOMPtr folder = do_QueryInterface(aSupport, &rv); - if (NS_FAILED(rv)) return rv; + nsCOMPtr item; + rv = enumerator->GetNext(getter_AddRefs(item)); + if (NS_FAILED(rv)) + break; + + nsCOMPtr folder(do_QueryInterface(item, &rv)); + if (NS_FAILED(rv)) + return rv; + folder->ResetNamespaceReferences(); - rv = enumerator->Next(); } return rv; } @@ -7132,21 +7144,27 @@ NS_IMETHODIMP nsImapMailFolder::FindOnlineSubFolder(const nsACString& targetOnli if (onlineName.Equals(targetOnlineName)) return QueryInterface(NS_GET_IID(nsIMsgImapMailFolder), (void **) aResultFolder); - nsCOMPtr enumerator; - GetSubFoldersObsolete(getter_AddRefs(enumerator)); + + nsCOMPtr enumerator; + GetSubFolders(getter_AddRefs(enumerator)); if (!enumerator) return NS_OK; - nsCOMPtr aSupport; - rv = enumerator->First(); - while (NS_SUCCEEDED(rv)) + + PRBool hasMore; + while (NS_SUCCEEDED(enumerator->HasMoreElements(&hasMore)) && hasMore) { - rv = enumerator->CurrentItem(getter_AddRefs(aSupport)); - nsCOMPtr folder = do_QueryInterface(aSupport, &rv); - if (NS_FAILED(rv)) return rv; + nsCOMPtr item; + rv = enumerator->GetNext(getter_AddRefs(item)); + if (NS_FAILED(rv)) + break; + + nsCOMPtr folder(do_QueryInterface(item, &rv)); + if (NS_FAILED(rv)) + return rv; + rv = folder->FindOnlineSubFolder(targetOnlineName, aResultFolder); if (*aResultFolder) return rv; - rv = enumerator->Next(); } return rv; } @@ -7330,19 +7348,25 @@ NS_IMETHODIMP nsImapMailFolder::RenameClient(nsIMsgWindow *msgWindow, nsIMsgFold NS_IMETHODIMP nsImapMailFolder::RenameSubFolders(nsIMsgWindow *msgWindow, nsIMsgFolder *oldFolder) { - nsresult rv = NS_OK; m_initialized = PR_TRUE; - nsCOMPtr enumerator; - oldFolder->GetSubFoldersObsolete(getter_AddRefs(enumerator)); - nsCOMPtr aSupport; - rv = enumerator->First(); - while (NS_SUCCEEDED(rv)) - { - rv = enumerator->CurrentItem(getter_AddRefs(aSupport)); + nsCOMPtr enumerator; + nsresult rv = oldFolder->GetSubFolders(getter_AddRefs(enumerator)); + NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtrmsgFolder = do_QueryInterface(aSupport); - nsCOMPtr folder = do_QueryInterface(msgFolder, &rv); - if (NS_FAILED(rv)) return rv; + PRBool hasMore; + while (NS_SUCCEEDED(enumerator->HasMoreElements(&hasMore)) && hasMore) + { + nsCOMPtr item; + if (enumerator->GetNext(getter_AddRefs(item))) + continue; + + nsCOMPtr msgFolder(do_QueryInterface(item, &rv)); + if (NS_FAILED(rv)) + return rv; + + nsCOMPtr folder(do_QueryInterface(msgFolder, &rv)); + if (NS_FAILED(rv)) + return rv; PRUnichar hierarchyDelimiter = '/'; folder->GetHierarchyDelimiter(&hierarchyDelimiter); @@ -7412,7 +7436,6 @@ NS_IMETHODIMP nsImapMailFolder::RenameSubFolders(nsIMsgWindow *msgWindow, nsIMsg msgFolder->AlertFilterChanged(msgWindow); child->RenameSubFolders(msgWindow, msgFolder); } - rv = enumerator->Next(); } return rv; }