114345 r=bienvenu sr=mscott Remove m_parsingInbox boolean, ask the db if the summary is valid, if not, it is being built and wait for it to be over, before downloading msgs.
git-svn-id: svn://10.0.0.236/trunk@110495 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -56,6 +56,5 @@ interface nsIMsgLocalMailFolder : nsISupports {
|
||||
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;
|
||||
};
|
||||
|
||||
@@ -98,7 +98,6 @@
|
||||
#include "nsEscape.h"
|
||||
#include "nsLocalStringBundle.h"
|
||||
|
||||
|
||||
static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
|
||||
static NS_DEFINE_CID(kMailboxServiceCID, NS_MAILBOXSERVICE_CID);
|
||||
static NS_DEFINE_CID(kCMailDB, NS_MAILDB_CID);
|
||||
@@ -149,7 +148,7 @@ nsLocalMailCopyState::~nsLocalMailCopyState()
|
||||
nsMsgLocalMailFolder::nsMsgLocalMailFolder(void)
|
||||
: mHaveReadNameFromDB(PR_FALSE), mGettingMail(PR_FALSE),
|
||||
mInitialized(PR_FALSE), mCopyState(nsnull), mType(nsnull),
|
||||
mCheckForNewMessagesAfterParsing(PR_FALSE), mParsingInbox(PR_FALSE)
|
||||
mCheckForNewMessagesAfterParsing(PR_FALSE)
|
||||
|
||||
{
|
||||
// NS_INIT_REFCNT(); done by superclass
|
||||
@@ -572,8 +571,6 @@ nsresult nsMsgLocalMailFolder::GetDatabase(nsIMsgWindow *aMsgWindow)
|
||||
if(folderOpen == NS_MSG_ERROR_FOLDER_SUMMARY_MISSING ||
|
||||
folderOpen == NS_MSG_ERROR_FOLDER_SUMMARY_OUT_OF_DATE)
|
||||
{
|
||||
if(mFlags & MSG_FOLDER_FLAG_INBOX)
|
||||
mParsingInbox = PR_TRUE;
|
||||
if(NS_FAILED(rv = ParseFolder(aMsgWindow, this)))
|
||||
return rv;
|
||||
else
|
||||
@@ -611,7 +608,6 @@ nsMsgLocalMailFolder::UpdateFolder(nsIMsgWindow *aWindow)
|
||||
NS_ENSURE_SUCCESS(rv,rv);
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -1455,7 +1451,7 @@ NS_IMETHODIMP nsMsgLocalMailFolder::GetDeletable(PRBool *deletable)
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP nsMsgLocalMailFolder::GetRequiresCleanup(PRBool *requiresCleanup)
|
||||
{
|
||||
#ifdef HAVE_PORT
|
||||
@@ -1470,6 +1466,7 @@ NS_IMETHODIMP nsMsgLocalMailFolder::GetRequiresCleanup(PRBool *requiresCleanup)
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP nsMsgLocalMailFolder::GetSizeOnDisk(PRUint32* size)
|
||||
{
|
||||
#ifdef HAVE_PORT
|
||||
@@ -2191,13 +2188,15 @@ NS_IMETHODIMP nsMsgLocalMailFolder::GetNewMessages(nsIMsgWindow *aWindow, nsIUrl
|
||||
PRUint32 numFolders;
|
||||
rv = rootFolder->GetFoldersWithFlag(MSG_FOLDER_FLAG_INBOX, 1, &numFolders, getter_AddRefs(inbox));
|
||||
}
|
||||
PRBool parsingInbox;
|
||||
nsCOMPtr<nsIMsgLocalMailFolder> localInbox = do_QueryInterface(inbox, &rv);
|
||||
if (NS_SUCCEEDED(rv) && localInbox)
|
||||
{
|
||||
rv = localInbox->GetParsingInbox(&parsingInbox);
|
||||
NS_ENSURE_SUCCESS(rv,rv);
|
||||
if (!parsingInbox)
|
||||
PRBool valid = PR_FALSE;
|
||||
nsCOMPtr <nsIMsgDatabase> db;
|
||||
rv = inbox->GetMsgDatabase(aWindow, getter_AddRefs(db));
|
||||
if (NS_SUCCEEDED(rv) && db)
|
||||
rv = db->GetSummaryValid(&valid);
|
||||
if (valid)
|
||||
rv = localMailServer->GetNewMail(aWindow, aListener, inbox, nsnull);
|
||||
else
|
||||
rv = localInbox->SetCheckForNewMessagesAfterParsing(PR_TRUE);
|
||||
@@ -3130,10 +3129,11 @@ nsMsgLocalMailFolder::OnStopRunningUrl(nsIURI * aUrl, nsresult aExitCode)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mParsingInbox)
|
||||
if (mDatabase && (mFlags & MSG_FOLDER_FLAG_INBOX))
|
||||
{
|
||||
mParsingInbox = PR_FALSE;
|
||||
if (mCheckForNewMessagesAfterParsing)
|
||||
PRBool valid;
|
||||
mDatabase->GetSummaryValid(&valid);
|
||||
if (valid && mCheckForNewMessagesAfterParsing)
|
||||
{
|
||||
if (msgWindow)
|
||||
rv = GetNewMessages(msgWindow, nsnull);
|
||||
@@ -3141,7 +3141,6 @@ nsMsgLocalMailFolder::OnStopRunningUrl(nsIURI * aUrl, nsresult aExitCode)
|
||||
}
|
||||
}
|
||||
}
|
||||
mParsingInbox = PR_FALSE; //make sure we turn off this flag even if parsing fails or else it will be a deadlock
|
||||
return nsMsgDBFolder::OnStopRunningUrl(aUrl, aExitCode);
|
||||
}
|
||||
|
||||
@@ -3274,14 +3273,6 @@ nsMsgLocalMailFolder::SetCheckForNewMessagesAfterParsing(PRBool aCheckForNewMess
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMsgLocalMailFolder::GetParsingInbox(PRBool *aParsingInbox)
|
||||
{
|
||||
NS_ENSURE_ARG(aParsingInbox);
|
||||
*aParsingInbox = mParsingInbox;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMsgLocalMailFolder::NotifyCompactCompleted()
|
||||
{
|
||||
|
||||
@@ -142,8 +142,7 @@ public:
|
||||
NS_IMETHOD UpdateSummaryTotals(PRBool force) ;
|
||||
|
||||
NS_IMETHOD GetDeletable (PRBool *deletable);
|
||||
NS_IMETHOD GetRequiresCleanup(PRBool *requiresCleanup);
|
||||
|
||||
NS_IMETHOD GetRequiresCleanup(PRBool *requiresCleanup);
|
||||
NS_IMETHOD GetSizeOnDisk(PRUint32* size);
|
||||
|
||||
NS_IMETHOD UserNeedsToAuthenticateForFolder(PRBool displayOnly, PRBool *authenticate);
|
||||
@@ -215,7 +214,6 @@ protected:
|
||||
//time
|
||||
const char *mType;
|
||||
PRBool mCheckForNewMessagesAfterParsing;
|
||||
PRBool mParsingInbox;
|
||||
nsCOMPtr<nsIMsgStringService> mMsgStringService;
|
||||
|
||||
nsresult setSubfolderFlag(PRUnichar *aFolderName, PRUint32 flags);
|
||||
|
||||
@@ -177,59 +177,57 @@ nsPop3IncomingServer::GetLocalStoreType(char **type)
|
||||
NS_IMETHODIMP nsPop3IncomingServer::PerformBiff()
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsCOMPtr<nsIPop3Service> pop3Service(do_GetService(kCPop3ServiceCID, &rv));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
nsCOMPtr<nsIMsgFolder> inbox;
|
||||
nsCOMPtr<nsIFolder> rootFolder;
|
||||
rv = GetRootFolder(getter_AddRefs(rootFolder));
|
||||
if(NS_SUCCEEDED(rv))
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
nsCOMPtr<nsIMsgFolder> inbox;
|
||||
nsCOMPtr<nsIFolder> rootFolder;
|
||||
rv = GetRootFolder(getter_AddRefs(rootFolder));
|
||||
if(NS_SUCCEEDED(rv))
|
||||
{
|
||||
nsCOMPtr<nsIMsgFolder> rootMsgFolder = do_QueryInterface(rootFolder);
|
||||
if(rootMsgFolder)
|
||||
nsCOMPtr<nsIMsgFolder> rootMsgFolder = do_QueryInterface(rootFolder);
|
||||
if(rootMsgFolder)
|
||||
{
|
||||
PRUint32 numFolders;
|
||||
rv = rootMsgFolder->GetFoldersWithFlag(MSG_FOLDER_FLAG_INBOX, 1,
|
||||
&numFolders,
|
||||
getter_AddRefs(inbox));
|
||||
if (NS_FAILED(rv) || numFolders != 1) return rv;
|
||||
}
|
||||
}
|
||||
PRUint32 numFolders;
|
||||
rv = rootMsgFolder->GetFoldersWithFlag(MSG_FOLDER_FLAG_INBOX, 1,
|
||||
&numFolders,
|
||||
getter_AddRefs(inbox));
|
||||
if (NS_FAILED(rv) || numFolders != 1) return rv;
|
||||
}
|
||||
}
|
||||
|
||||
//Biff just needs to give status in one of the windows. so do it in topmost window.
|
||||
nsCOMPtr<nsIMsgMailSession> mailSession =
|
||||
do_GetService(kCMsgMailSessionCID, &rv);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
|
||||
nsCOMPtr<nsIMsgWindow> msgWindow;
|
||||
nsCOMPtr<nsIMsgMailSession> mailSession = do_GetService(kCMsgMailSessionCID, &rv);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
nsCOMPtr<nsIMsgWindow> msgWindow;
|
||||
|
||||
rv = mailSession->GetTopmostMsgWindow(getter_AddRefs(msgWindow));
|
||||
if(NS_SUCCEEDED(rv))
|
||||
if(NS_SUCCEEDED(rv))
|
||||
{
|
||||
PRBool downloadOnBiff = PR_FALSE;
|
||||
rv = GetDownloadOnBiff(&downloadOnBiff);
|
||||
if (downloadOnBiff)
|
||||
{
|
||||
PRBool downloadOnBiff = PR_FALSE;
|
||||
rv = GetDownloadOnBiff(&downloadOnBiff);
|
||||
if (downloadOnBiff)
|
||||
{
|
||||
nsCOMPtr <nsIMsgLocalMailFolder> localInbox = do_QueryInterface(inbox, &rv);
|
||||
PRBool parsingInbox;
|
||||
if (localInbox && NS_SUCCEEDED(rv))
|
||||
{
|
||||
rv = localInbox->GetParsingInbox(&parsingInbox);
|
||||
NS_ENSURE_SUCCESS(rv,rv);
|
||||
if (!parsingInbox)
|
||||
rv = pop3Service->GetNewMail(msgWindow, nsnull, inbox, this, nsnull);
|
||||
else
|
||||
rv = localInbox->SetCheckForNewMessagesAfterParsing(PR_TRUE);
|
||||
}
|
||||
}
|
||||
nsCOMPtr <nsIMsgLocalMailFolder> localInbox = do_QueryInterface(inbox, &rv);
|
||||
if (localInbox && NS_SUCCEEDED(rv))
|
||||
{
|
||||
PRBool valid =PR_FALSE;
|
||||
nsCOMPtr <nsIMsgDatabase> db;
|
||||
rv = inbox->GetMsgDatabase(msgWindow, getter_AddRefs(db));
|
||||
if (NS_SUCCEEDED(rv) && db)
|
||||
rv = db->GetSummaryValid(&valid);
|
||||
if (NS_SUCCEEDED(rv) && valid)
|
||||
rv = pop3Service->GetNewMail(msgWindow, nsnull, inbox, this, nsnull);
|
||||
else
|
||||
rv = pop3Service->CheckForNewMail(msgWindow, nsnull, inbox, this,
|
||||
nsnull);
|
||||
rv = localInbox->SetCheckForNewMessagesAfterParsing(PR_TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
else
|
||||
rv = pop3Service->CheckForNewMail(msgWindow, nsnull, inbox, this,
|
||||
nsnull);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
||||
Reference in New Issue
Block a user