fix updating of folders after imap/moves r=mscott bug 12491

This commit is contained in:
bienvenu%netscape.com 1999-11-01 01:10:08 +00:00
parent 10e0f64b8b
commit 9ba6e2321b
3 changed files with 79 additions and 18 deletions

View File

@ -2240,7 +2240,7 @@ nsImapMailFolder::NormalEndMsgWriteStream(nsMsgKey uidOfMessage)
nsCOMPtr<nsIMsgDBHdr> msgHdr; nsCOMPtr<nsIMsgDBHdr> msgHdr;
m_curMsgUid = uidOfMessage; m_curMsgUid = uidOfMessage;
res = GetMessageHeader(getter_AddRefs(msgHdr)); res = GetMessageHeader(m_curMsgUid, getter_AddRefs(msgHdr));
if (NS_SUCCEEDED(res)) if (NS_SUCCEEDED(res))
msgHdr->MarkRead(PR_TRUE); msgHdr->MarkRead(PR_TRUE);
@ -2253,7 +2253,7 @@ nsImapMailFolder::AbortMsgWriteStream()
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
nsresult nsImapMailFolder::GetMessageHeader(nsIMsgDBHdr ** aMsgHdr) nsresult nsImapMailFolder::GetMessageHeader(nsMsgKey key, nsIMsgDBHdr ** aMsgHdr)
{ {
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (aMsgHdr) if (aMsgHdr)
@ -2264,7 +2264,7 @@ nsresult nsImapMailFolder::GetMessageHeader(nsIMsgDBHdr ** aMsgHdr)
// recent header we downloaded, and most recent message we've // recent header we downloaded, and most recent message we've
// downloaded. We may want to break this up. // downloaded. We may want to break this up.
if (NS_SUCCEEDED(rv) && mDatabase) // did we get a db back? if (NS_SUCCEEDED(rv) && mDatabase) // did we get a db back?
rv = mDatabase->GetMsgHdrForKey(m_curMsgUid, aMsgHdr); rv = mDatabase->GetMsgHdrForKey(key, aMsgHdr);
} }
else else
rv = NS_ERROR_NULL_POINTER; rv = NS_ERROR_NULL_POINTER;
@ -2508,6 +2508,7 @@ nsImapMailFolder::OnStopRunningUrl(nsIURI *aUrl, nsresult aExitCode)
NS_PRECONDITION(aUrl, "just a sanity check since this is a test program"); NS_PRECONDITION(aUrl, "just a sanity check since this is a test program");
nsresult rv = NS_OK; nsresult rv = NS_OK;
m_urlRunning = PR_FALSE; m_urlRunning = PR_FALSE;
NS_WITH_SERVICE(nsIMsgMailSession, session, kMsgMailSessionCID, &rv);
if (aUrl) if (aUrl)
{ {
nsCOMPtr<nsIImapUrl> imapUrl = do_QueryInterface(aUrl); nsCOMPtr<nsIImapUrl> imapUrl = do_QueryInterface(aUrl);
@ -2550,7 +2551,15 @@ nsImapMailFolder::OnStopRunningUrl(nsIURI *aUrl, nsresult aExitCode)
} }
ClearCopyState(aExitCode); ClearCopyState(aExitCode);
} }
if (session)
{
PRBool folderOpen = PR_FALSE;
session->IsFolderOpenInWindow(this, &folderOpen);
if (folderOpen)
UpdateFolder(); UpdateFolder();
else
UpdatePendingCounts(PR_TRUE, PR_FALSE);
}
break; break;
case nsIImapUrl::nsImapAppendMsgFromFile: case nsIImapUrl::nsImapAppendMsgFromFile:
case nsIImapUrl::nsImapAppendDraftFromFile: case nsIImapUrl::nsImapAppendDraftFromFile:
@ -2580,6 +2589,47 @@ nsImapMailFolder::OnStopRunningUrl(nsIURI *aUrl, nsresult aExitCode)
return rv; return rv;
} }
void nsImapMailFolder::UpdatePendingCounts(PRBool countUnread, PRBool missingAreRead)
{
nsresult rv;
if (m_copyState)
{
ChangeNumPendingTotalMessages(m_copyState->m_totalCount);
if (countUnread)
{
// count the moves that were unread
int numUnread = 0;
nsCOMPtr <nsIMsgFolder> srcFolder = do_QueryInterface(m_copyState->m_srcSupport);
for (int keyIndex=0; keyIndex < m_copyState->m_totalCount; keyIndex++)
{
nsCOMPtr<nsIMessage> message;
nsCOMPtr<nsISupports> aSupport =
getter_AddRefs(m_copyState->m_messages->ElementAt(keyIndex));
message = do_QueryInterface(aSupport, &rv);
// if the key is not there, then assume what the caller tells us to.
PRBool isRead = missingAreRead;
PRUint32 flags;
if (message )
{
message->GetFlags(&flags);
isRead = flags & MSG_FLAG_READ;
}
if (!isRead)
numUnread++;
}
if (numUnread)
ChangeNumPendingUnread(numUnread);
}
SummaryChanged();
}
}
// nsIImapExtensionSink methods // nsIImapExtensionSink methods
NS_IMETHODIMP NS_IMETHODIMP

View File

@ -253,6 +253,8 @@ public:
// overriding nsMsgDBFolder::GetMsgDatabase() // overriding nsMsgDBFolder::GetMsgDatabase()
NS_IMETHOD GetMsgDatabase(nsIMsgDatabase** aMsgDatabase); NS_IMETHOD GetMsgDatabase(nsIMsgDatabase** aMsgDatabase);
nsresult GetMessageHeader(nsMsgKey key, nsIMsgDBHdr ** aMsgHdr);
nsresult MoveIncorporatedMessage(nsIMsgDBHdr *mailHdr, nsresult MoveIncorporatedMessage(nsIMsgDBHdr *mailHdr,
nsIMsgDatabase *sourceDB, nsIMsgDatabase *sourceDB,
char *destFolder, char *destFolder,
@ -272,6 +274,7 @@ protected:
nsresult SyncFlags(nsImapFlagAndUidState *flagState); nsresult SyncFlags(nsImapFlagAndUidState *flagState);
void UpdatePendingCounts(PRBool countUnread, PRBool missingAreRead);
void SetIMAPDeletedFlag(nsIMsgDatabase *mailDB, const nsMsgKeyArray &msgids, PRBool markDeleted); void SetIMAPDeletedFlag(nsIMsgDatabase *mailDB, const nsMsgKeyArray &msgids, PRBool markDeleted);
virtual PRBool ShowDeletedMessages(); virtual PRBool ShowDeletedMessages();
virtual PRBool DeleteIsMoveToTrash(); virtual PRBool DeleteIsMoveToTrash();
@ -308,8 +311,6 @@ protected:
nsresult BuildIdsAndKeyArray(nsISupportsArray* messages, nsresult BuildIdsAndKeyArray(nsISupportsArray* messages,
nsCString& msgIds, nsMsgKeyArray& keyArray); nsCString& msgIds, nsMsgKeyArray& keyArray);
nsresult GetMessageHeader(nsIMsgDBHdr ** aMsgHdr);
nsNativeFileSpec *m_pathName; nsNativeFileSpec *m_pathName;
PRBool m_initialized; PRBool m_initialized;
PRBool m_haveDiscoveredAllFolders; PRBool m_haveDiscoveredAllFolders;

View File

@ -107,16 +107,26 @@ nsresult nsImapMoveCoalescer::PlaybackMoves(nsIEventQueue *eventQueue)
nsCOMPtr<nsISupportsArray> messages; nsCOMPtr<nsISupportsArray> messages;
NS_NewISupportsArray(getter_AddRefs(messages)); NS_NewISupportsArray(getter_AddRefs(messages));
// rv = destFolder->CopyMessages(m_sourceFolder, for (PRUint32 keyIndex = 0; i < keysToAdd->GetSize(); i++)
// nsISupportsArray* messages, {
// PR_TRUE, nsnull, nsCOMPtr<nsIMessage> message;
// nsIMsgCopyServiceListener* listener) nsCOMPtr<nsIMsgDBHdr> mailHdr = nsnull;
rv = m_sourceFolder->GetMessageHeader(keysToAdd->ElementAt(keyIndex), getter_AddRefs(mailHdr));
if (NS_SUCCEEDED(rv) && mailHdr)
rv = imapService->OnlineMessageCopy(eventQueue, {
m_sourceFolder, messageIds.GetBuffer(), nsCOMPtr<nsISupports> iSupports;
destFolder, PR_TRUE, PR_TRUE, m_sourceFolder->CreateMessageFromMsgDBHdr(mailHdr, getter_AddRefs(message)) ;
urlListener, nsnull, nsnull); iSupports = do_QueryInterface(message);
messages->AppendElement(iSupports);
}
}
rv = destFolder->CopyMessages(m_sourceFolder,
messages, PR_TRUE, nsnull,
/*nsIMsgCopyServiceListener* listener*/ nsnull);
// rv = imapService->OnlineMessageCopy(eventQueue,
// m_sourceFolder, messageIds.GetBuffer(),
// destFolder, PR_TRUE, PR_TRUE,
// urlListener, nsnull, nsnull);
} }
} }
} }