From 3e1cdfbad519f5a7af8995554f298656007d28f2 Mon Sep 17 00:00:00 2001 From: "naving%netscape.com" Date: Thu, 12 Jul 2001 05:54:43 +0000 Subject: [PATCH] 90186 r=bienvenu sr=mscott; Sort the keys but keep the hdrs in sync with the keys so that copying messages works correctly --- mailnews/local/src/nsLocalMailFolder.cpp | 45 ++++++++++++++++++++---- mailnews/local/src/nsLocalMailFolder.h | 1 + mailnews/local/src/nsMailboxService.cpp | 1 - 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/mailnews/local/src/nsLocalMailFolder.cpp b/mailnews/local/src/nsLocalMailFolder.cpp index c27a3302f617..57663d3d5d84 100644 --- a/mailnews/local/src/nsLocalMailFolder.cpp +++ b/mailnews/local/src/nsLocalMailFolder.cpp @@ -1638,6 +1638,31 @@ nsMsgLocalMailFolder::ClearCopyState(PRBool moveCopySucceeded) if(NS_SUCCEEDED(result) && haveSemaphore) ReleaseSemaphore(NS_STATIC_CAST(nsIMsgLocalMailFolder*, this)); } + +nsresult +nsMsgLocalMailFolder::SortMessagesBasedOnKey(nsISupportsArray *messages, nsMsgKeyArray *aKeyArray, nsIMsgFolder *srcFolder) +{ + nsresult rv = NS_OK; + PRUint32 numMessages = 0; + rv = messages->Count(&numMessages); + NS_ENSURE_SUCCESS(rv,rv); + NS_ASSERTION ((numMessages == aKeyArray->GetSize()), "message array and key array size are not same"); + rv = messages->Clear(); + NS_ENSURE_SUCCESS(rv,rv); + nsCOMPtr msgHdr; + nsCOMPtr folderInfo; + nsCOMPtr db; + rv = srcFolder->GetDBFolderInfoAndDB(getter_AddRefs(folderInfo), getter_AddRefs(db)); + if (NS_SUCCEEDED(rv) && db) + for (PRUint32 i=0;i < numMessages; i++) + { + rv = db->GetMsgHdrForKey(aKeyArray->GetAt(i), getter_AddRefs(msgHdr)); + NS_ENSURE_SUCCESS(rv,rv); + if (msgHdr) + messages->AppendElement(msgHdr); + } + return rv; +} NS_IMETHODIMP nsMsgLocalMailFolder::CopyMessages(nsIMsgFolder* srcFolder, nsISupportsArray* @@ -1732,16 +1757,16 @@ nsMsgLocalMailFolder::CopyMessages(nsIMsgFolder* srcFolder, nsISupportsArray* } } PRUint32 numMsgs = 0; - messages->Count(&numMsgs); + mCopyState->m_messages->Count(&numMsgs); if (numMsgs > 1 && (protocolType.EqualsIgnoreCase("imap") || protocolType.EqualsIgnoreCase("mailbox"))) { mCopyState->m_copyingMultipleMessages = PR_TRUE; - rv = CopyMessagesTo(messages, msgWindow, this, isMove); + rv = CopyMessagesTo(mCopyState->m_messages, msgWindow, this, isMove); } else { nsCOMPtr msgSupport; - msgSupport = getter_AddRefs(messages->ElementAt(0)); + msgSupport = getter_AddRefs(mCopyState->m_messages->ElementAt(0)); if (msgSupport) { rv = CopyMessageTo(msgSupport, this, msgWindow, isMove); @@ -2074,7 +2099,7 @@ NS_IMETHODIMP nsMsgLocalMailFolder::GetNewMessages(nsIMsgWindow *aWindow) nsresult nsMsgLocalMailFolder::WriteStartOfNewMessage() { mCopyState->m_curDstKey = mCopyState->m_fileStream->tell(); - + // CopyFileMessage() and CopyMessages() from servers other than pop3 if (mCopyState->m_parseMsgState) { @@ -2151,7 +2176,7 @@ NS_IMETHODIMP nsMsgLocalMailFolder::BeginCopy(nsIMsgDBHdr *message) if (!mCopyState) return NS_ERROR_NULL_POINTER; nsresult rv = NS_OK; mCopyState->m_fileStream->seek(PR_SEEK_END, 0); - + PRInt32 messageIndex = (mCopyState->m_copyingMultipleMessages) ? mCopyState->m_curCopyIndex - 1 : mCopyState->m_curCopyIndex; NS_ASSERTION(!mCopyState->m_copyingMultipleMessages || mCopyState->m_curCopyIndex > 0, "mCopyState->m_curCopyIndex invalid"); // by the time we get here, m_curCopyIndex is 1 relative because WriteStartOfNewMessage increments it @@ -2196,7 +2221,6 @@ NS_IMETHODIMP nsMsgLocalMailFolder::CopyData(nsIInputStream *aIStream, PRInt32 a mCopyState->m_leftOver += readCount; mCopyState->m_dataBuffer[mCopyState->m_leftOver] ='\0'; start = mCopyState->m_dataBuffer; - end = PL_strstr(start, "\r"); if (!end) end = PL_strstr(start, "\n"); @@ -2322,7 +2346,10 @@ NS_IMETHODIMP nsMsgLocalMailFolder::EndCopy(PRBool copySucceeded) mCopyState->m_fromLineSeen = PR_FALSE; // flush the copied message. if (mCopyState->m_fileStream) - mCopyState->m_fileStream->flush(); + { + rv = mCopyState->m_fileStream->flush(); + NS_ENSURE_SUCCESS(rv,rv); + } } //Copy the header to the new database if(copySucceeded && mCopyState->m_message) @@ -2625,6 +2652,10 @@ nsresult nsMsgLocalMailFolder::CopyMessagesTo(nsISupportsArray *messages, } } } + keyArray.QuickSort(); + rv = SortMessagesBasedOnKey(messages, &keyArray, srcFolder); + NS_ENSURE_SUCCESS(rv,rv); + nsCOMPtr streamListener(do_QueryInterface(copyStreamListener)); if(!streamListener) diff --git a/mailnews/local/src/nsLocalMailFolder.h b/mailnews/local/src/nsLocalMailFolder.h index 6e234a21716b..eefb5c8d4827 100644 --- a/mailnews/local/src/nsLocalMailFolder.h +++ b/mailnews/local/src/nsLocalMailFolder.h @@ -181,6 +181,7 @@ protected: // copy message helper nsresult DisplayMoveCopyStatusMsg(); + nsresult SortMessagesBasedOnKey(nsISupportsArray *messages, nsMsgKeyArray *aKeyArray, nsIMsgFolder *srcFolder); nsresult CopyMessageTo(nsISupports *message, nsIMsgFolder *dstFolder, nsIMsgWindow *msgWindow, PRBool isMove); diff --git a/mailnews/local/src/nsMailboxService.cpp b/mailnews/local/src/nsMailboxService.cpp index f05bde983d01..e354cce255c2 100644 --- a/mailnews/local/src/nsMailboxService.cpp +++ b/mailnews/local/src/nsMailboxService.cpp @@ -133,7 +133,6 @@ nsresult nsMailboxService::CopyMessages(nsMsgKeyArray *msgKeys, nsCOMPtr msgUrl (do_QueryInterface(url)); nsCOMPtr mailboxUrl (do_QueryInterface(url)); msgUrl->SetMsgWindow(aMsgWindow); - msgKeys->QuickSort(); // sort the keys, which might reduce seeking while move/copying mailboxUrl->SetMoveCopyMsgKeys(msgKeys->GetArray(), msgKeys->GetSize()); rv = RunMailboxUrl(url, aMailboxCopyHandler);