90186 r=bienvenu sr=mscott; Sort the keys but keep the hdrs in sync with the keys so that

copying messages works correctly
This commit is contained in:
naving%netscape.com 2001-07-12 05:54:43 +00:00
Родитель 548e6eb3dd
Коммит 3e1cdfbad5
3 изменённых файлов: 39 добавлений и 8 удалений

Просмотреть файл

@ -1639,6 +1639,31 @@ nsMsgLocalMailFolder::ClearCopyState(PRBool moveCopySucceeded)
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 <nsIMsgDBHdr> msgHdr;
nsCOMPtr<nsIDBFolderInfo> folderInfo;
nsCOMPtr<nsIMsgDatabase> 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*
messages, PRBool isMove,
@ -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<nsISupports> msgSupport;
msgSupport = getter_AddRefs(messages->ElementAt(0));
msgSupport = getter_AddRefs(mCopyState->m_messages->ElementAt(0));
if (msgSupport)
{
rv = CopyMessageTo(msgSupport, this, msgWindow, isMove);
@ -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<nsIStreamListener>
streamListener(do_QueryInterface(copyStreamListener));
if(!streamListener)

Просмотреть файл

@ -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);

Просмотреть файл

@ -133,7 +133,6 @@ nsresult nsMailboxService::CopyMessages(nsMsgKeyArray *msgKeys,
nsCOMPtr<nsIMsgMailNewsUrl> msgUrl (do_QueryInterface(url));
nsCOMPtr<nsIMailboxUrl> 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);