зеркало из https://github.com/mozilla/gecko-dev.git
Checking in for smeredith@netscape.com.
Fix for bug 18266. Check all IMAP folders for new messages when getMessage is pressed. Added function GetNewMessagesAllFolders. r=bienvenu, sr=mscott.
This commit is contained in:
Родитель
a02e4a6de0
Коммит
45c1cd44cb
|
@ -29,6 +29,7 @@ interface nsIEventQueue;
|
||||||
interface nsIImapProtocol;
|
interface nsIImapProtocol;
|
||||||
interface nsISupportsArray;
|
interface nsISupportsArray;
|
||||||
interface nsIMsgFolder;
|
interface nsIMsgFolder;
|
||||||
|
interface nsIMsgWindow;
|
||||||
|
|
||||||
typedef long nsMsgImapDeleteModel;
|
typedef long nsMsgImapDeleteModel;
|
||||||
|
|
||||||
|
@ -81,6 +82,7 @@ interface nsIImapIncomingServer : nsISupports {
|
||||||
void reDiscoverAllFolders();
|
void reDiscoverAllFolders();
|
||||||
nsIMsgFolder GetReadMailPFC(in boolean createIfMissing);
|
nsIMsgFolder GetReadMailPFC(in boolean createIfMissing);
|
||||||
nsIMsgFolder GetSentMailPFC(in boolean createIfMissing);
|
nsIMsgFolder GetSentMailPFC(in boolean createIfMissing);
|
||||||
|
void GetNewMessagesAllFolders(in nsIMsgFolder aRootFolder, in nsIMsgWindow aWindow);
|
||||||
attribute boolean doingLsub;
|
attribute boolean doingLsub;
|
||||||
|
|
||||||
void allowFolderConversion(out boolean allowConversion);
|
void allowFolderConversion(out boolean allowConversion);
|
||||||
|
|
|
@ -3284,3 +3284,49 @@ nsImapIncomingServer::GetSearchScope(nsMsgSearchScopeValue *searchScope)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Gets new messages (imap /Select) for this folder and all subfolders except
|
||||||
|
// Trash. This is a recursive function. Gets new messages for current folder
|
||||||
|
// first, then calls self recursively for each subfolder.
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsImapIncomingServer::GetNewMessagesAllFolders(nsIMsgFolder *aRootFolder, nsIMsgWindow *aWindow)
|
||||||
|
{
|
||||||
|
nsresult retval = NS_OK;
|
||||||
|
|
||||||
|
if (!aRootFolder)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
// If this is the trash folder, we don't need to do anything here or with
|
||||||
|
// any subfolders.
|
||||||
|
PRUint32 flags = 0;
|
||||||
|
aRootFolder->GetFlags(&flags);
|
||||||
|
if (flags & MSG_FOLDER_FLAG_TRASH)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
// Get new messages for this folder.
|
||||||
|
aRootFolder->UpdateFolder(aWindow);
|
||||||
|
|
||||||
|
// Loop through all subfolders to get new messages for them.
|
||||||
|
nsCOMPtr<nsIEnumerator> aEnumerator;
|
||||||
|
retval = aRootFolder->GetSubFolders(getter_AddRefs(aEnumerator));
|
||||||
|
NS_ASSERTION((NS_SUCCEEDED(retval) && aEnumerator), "GetSubFolders() failed to return enumerator.");
|
||||||
|
if (NS_FAILED(retval))
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
nsresult more = aEnumerator->First();
|
||||||
|
|
||||||
|
while (NS_SUCCEEDED(more))
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsISupports> aSupport;
|
||||||
|
nsresult rv = aEnumerator->CurrentItem(getter_AddRefs(aSupport));
|
||||||
|
NS_ASSERTION((NS_SUCCEEDED(rv) && aSupport), "CurrentItem() failed.");
|
||||||
|
|
||||||
|
nsCOMPtr<nsIMsgFolder> msgFolder = do_QueryInterface(aSupport, &rv);
|
||||||
|
NS_ASSERTION((NS_SUCCEEDED(rv) && msgFolder), "nsIMsgFolder service not found.");
|
||||||
|
|
||||||
|
retval = GetNewMessagesAllFolders(msgFolder, aWindow);
|
||||||
|
|
||||||
|
more = aEnumerator->Next();
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
|
@ -2024,42 +2024,59 @@ nsImapMailFolder::DeleteSubFolders(nsISupportsArray* folders, nsIMsgWindow *msgW
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Called by Biff, or when user presses GetMsg button.
|
||||||
NS_IMETHODIMP nsImapMailFolder::GetNewMessages(nsIMsgWindow *aWindow, nsIUrlListener *aListener)
|
NS_IMETHODIMP nsImapMailFolder::GetNewMessages(nsIMsgWindow *aWindow, nsIUrlListener *aListener)
|
||||||
{
|
{
|
||||||
nsresult rv = NS_ERROR_FAILURE;
|
|
||||||
NS_WITH_SERVICE(nsIImapService, imapService, kCImapService, &rv);
|
|
||||||
if (NS_FAILED(rv)) return rv;
|
|
||||||
nsCOMPtr<nsIMsgFolder> inbox;
|
|
||||||
nsCOMPtr<nsIMsgFolder> rootFolder;
|
nsCOMPtr<nsIMsgFolder> rootFolder;
|
||||||
rv = GetRootFolder(getter_AddRefs(rootFolder));
|
nsresult rv = GetRootFolder(getter_AddRefs(rootFolder));
|
||||||
if(NS_SUCCEEDED(rv) && rootFolder)
|
|
||||||
{
|
if(NS_SUCCEEDED(rv) && rootFolder) {
|
||||||
PRUint32 numFolders;
|
|
||||||
rv = rootFolder->GetFoldersWithFlag(MSG_FOLDER_FLAG_INBOX, 1, &numFolders, getter_AddRefs(inbox));
|
|
||||||
}
|
|
||||||
if (inbox)
|
|
||||||
{
|
|
||||||
nsCOMPtr <nsIEventQueue> eventQ;
|
|
||||||
NS_WITH_SERVICE(nsIEventQueueService, pEventQService, kEventQueueServiceCID, &rv);
|
|
||||||
if (NS_SUCCEEDED(rv) && pEventQService)
|
|
||||||
pEventQService->GetThreadEventQueue(NS_CURRENT_THREAD,
|
|
||||||
getter_AddRefs(eventQ));
|
|
||||||
|
|
||||||
nsCOMPtr<nsIImapIncomingServer> imapServer;
|
nsCOMPtr<nsIImapIncomingServer> imapServer;
|
||||||
nsresult rv = GetImapIncomingServer(getter_AddRefs(imapServer));
|
nsresult rv = GetImapIncomingServer(getter_AddRefs(imapServer));
|
||||||
|
|
||||||
if (NS_SUCCEEDED(rv) && imapServer)
|
if (NS_SUCCEEDED(rv) && imapServer)
|
||||||
imapServer->GetDownloadBodiesOnGetNewMail(&m_downloadingFolderForOfflineUse);
|
imapServer->GetDownloadBodiesOnGetNewMail(&m_downloadingFolderForOfflineUse);
|
||||||
|
|
||||||
inbox->SetGettingNewMessages(PR_TRUE);
|
|
||||||
m_urlListener = aListener;
|
|
||||||
rv = imapService->SelectFolder(eventQ, inbox, this, aWindow, nsnull);
|
|
||||||
|
|
||||||
if (rv == NS_BINDING_ABORTED)
|
// Check preferences to see if we should check all folders for new
|
||||||
|
// messages, or just the inbox.
|
||||||
|
PRBool checkAllFolders = PR_FALSE;
|
||||||
|
|
||||||
|
nsCOMPtr <nsIPrefService> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID, &rv);
|
||||||
|
if (NS_SUCCEEDED(rv) && prefs)
|
||||||
{
|
{
|
||||||
inbox->NotifyFolderEvent(mFolderLoadedAtom);
|
|
||||||
rv = NS_OK;
|
nsCOMPtr<nsIPrefBranch> prefBranch;
|
||||||
|
rv = prefs->GetBranch("", getter_AddRefs(prefBranch));
|
||||||
|
|
||||||
|
|
||||||
|
// This pref might not exist, which is OK. We'll only check INBOX in that
|
||||||
|
// case.
|
||||||
|
if (NS_SUCCEEDED(rv) && prefBranch)
|
||||||
|
rv = prefBranch->GetBoolPref("mail.check_all_imap_folders_for_new", &checkAllFolders);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_urlListener = aListener;
|
||||||
|
|
||||||
|
if (checkAllFolders) {
|
||||||
|
|
||||||
|
// Get new messages in all folders (except trash).
|
||||||
|
if (imapServer)
|
||||||
|
imapServer->GetNewMessagesAllFolders(rootFolder, aWindow);
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
|
||||||
|
// Get new messages in inbox only.
|
||||||
|
PRUint32 numFolders;
|
||||||
|
nsCOMPtr<nsIMsgFolder> inbox;
|
||||||
|
rv = rootFolder->GetFoldersWithFlag(MSG_FOLDER_FLAG_INBOX, 1, &numFolders, getter_AddRefs(inbox));
|
||||||
|
if (inbox)
|
||||||
|
rv = inbox->UpdateFolder(aWindow);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче