fix one part of problem playing back offline moves from imap to local folders, 364082, sr=mscott

This commit is contained in:
bienvenu%nventure.com 2007-01-11 15:03:35 +00:00
Родитель 49dfbc8990
Коммит 10903030c5
4 изменённых файлов: 62 добавлений и 5 удалений

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

@ -43,7 +43,7 @@ typedef unsigned short imapMessageFlagsType;
typedef long nsOfflineImapOperationType;
[scriptable, uuid(2728cb2b-4716-4b5e-98a7-ce22569378e5)]
[scriptable, uuid(e576dace-db4f-4d23-aa6f-57165504848f)]
interface nsIMsgOfflineImapOperation : nsISupports
{
@ -75,5 +75,6 @@ interface nsIMsgOfflineImapOperation : nsISupports
readonly attribute long numberOfCopies;
void addMessageCopyOperation(in string destinationBox);
string getCopyDestination(in long copyIndex);
attribute unsigned long msgSize;
};

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

@ -56,7 +56,6 @@ NS_IMPL_ISUPPORTS1(nsMsgOfflineImapOperation, nsIMsgOfflineImapOperation)
#define PROP_NEW_FLAGS "newFlags"
#define PROP_MESSAGE_KEY "msgKey"
#define PROP_SRC_MESSAGE_KEY "srcMsgKey"
#define PROP_NEW_FLAGS "newFlags"
#define PROP_SRC_FOLDER_URI "srcFolderURI"
#define PROP_MOVE_DEST_FOLDER_URI "moveDest"
#define PROP_NUM_COPY_DESTS "numCopyDests"
@ -64,6 +63,7 @@ NS_IMPL_ISUPPORTS1(nsMsgOfflineImapOperation, nsIMsgOfflineImapOperation)
// them around since we delete off the front first.
#define PROP_KEYWORD_ADD "addedKeywords"
#define PROP_KEYWORD_REMOVE "removedKeywords"
#define PROP_MSG_SIZE "msgSize"
nsMsgOfflineImapOperation::nsMsgOfflineImapOperation(nsMsgDatabase *db, nsIMdbRow *row)
{
@ -364,6 +364,18 @@ NS_IMETHODIMP nsMsgOfflineImapOperation::GetCopyDestination(PRInt32 copyIndex, c
return NS_ERROR_NULL_POINTER;
}
/* attribute unsigned log msgSize; */
NS_IMETHODIMP nsMsgOfflineImapOperation::GetMsgSize(PRUint32 *aMsgSize)
{
NS_ENSURE_ARG(aMsgSize);
return m_mdb->GetUint32Property(m_mdbRow, PROP_MSG_SIZE, aMsgSize, 0);
}
NS_IMETHODIMP nsMsgOfflineImapOperation::SetMsgSize(PRUint32 aMsgSize)
{
return m_mdb->SetUint32Property(m_mdbRow, PROP_MSG_SIZE, aMsgSize);
}
void nsMsgOfflineImapOperation::Log(PRLogModuleInfo *logFile)
{
if (!IMAPOffline)

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

@ -6488,7 +6488,12 @@ nsresult nsImapMailFolder::CopyOfflineMsgBody(nsIMsgFolder *srcFolder, nsIMsgDBH
PRUint32 messageSize;
origHdr->GetMessageOffset(&messageOffset);
origHdr->GetOfflineMessageSize(&messageSize);
if (!messageSize)
{
nsCOMPtr<nsIMsgLocalMailFolder> localFolder = do_QueryInterface(srcFolder);
if (localFolder) //can just use regular message size
origHdr->GetMessageSize(&messageSize);
}
PRInt64 tellPos;
seekable->Tell(&tellPos);
nsInt64 curStorePos = tellPos;
@ -6528,6 +6533,13 @@ nsresult nsImapMailFolder::CopyOfflineMsgBody(nsIMsgFolder *srcFolder, nsIMsgDBH
}
}
}
if (NS_SUCCEEDED(rv))
{
PRUint32 resultFlags;
destHdr->OrFlags(MSG_FLAG_OFFLINE, &resultFlags);
destHdr->SetOfflineMessageSize(messageSize);
}
}
return rv;
}
@ -6650,8 +6662,18 @@ nsresult nsImapMailFolder::CopyMessagesOffline(nsIMsgFolder* srcFolder,
if (isMove)
{
PRUint32 msgSize;
PRUint32 msgFlags;
imapMessageFlagsType newImapFlags = 0;
message->GetMessageSize(&msgSize);
message->GetFlags(&msgFlags);
sourceOp->SetDestinationFolderURI(folderURI); // offline move
sourceOp->SetOperation(nsIMsgOfflineImapOperation::kMsgMoved);
sourceOp->SetMsgSize(msgSize);
newImapFlags = msgFlags & 0x7;
if (msgFlags & MSG_FLAG_FORWARDED)
newImapFlags |= kImapMsgForwardedFlag;
sourceOp->SetNewFlags(newImapFlags);
}
else
sourceOp->AddMessageCopyOperation(folderURI); // offline copy

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

@ -544,6 +544,24 @@ void nsImapOfflineSync::ProcessMoveOperation(nsIMsgOfflineImapOperation *op)
rv = m_currentFolder->GetMessageHeader(matchingFlagKeys.ElementAt(keyIndex), getter_AddRefs(mailHdr));
if (NS_SUCCEEDED(rv) && mailHdr)
{
PRUint32 msgSize;
// in case of a move, the header has already been deleted,
// so we've really got a fake header. We need to get its flags and
// size from the offline op to have any chance of doing the move.
mailHdr->GetMessageSize(&msgSize);
if (!msgSize)
{
imapMessageFlagsType newImapFlags;
PRUint32 msgFlags = 0;
op->GetMsgSize(&msgSize);
op->GetNewFlags(&newImapFlags);
// first three bits are the same
msgFlags |= (newImapFlags & 0x07);
if (newImapFlags & kImapMsgForwardedFlag)
msgFlags |= MSG_FLAG_FORWARDED;
mailHdr->SetFlags(msgFlags);
mailHdr->SetMessageSize(msgSize);
}
nsCOMPtr<nsISupports> iSupports;
iSupports = do_QueryInterface(mailHdr);
messages->AppendElement(iSupports);
@ -740,7 +758,8 @@ nsresult nsImapOfflineSync::ProcessNextOperation()
{
if (CreateOfflineFolders())
return NS_OK;
AdvanceToFirstIMAPFolder();
m_currentServer = nsnull;
AdvanceToNextFolder();
}
m_createdOfflineFolders = PR_TRUE;
}
@ -981,7 +1000,10 @@ nsresult nsImapOfflineSync::ProcessNextOperation()
// if we are updating more than one folder then we need the iterator
if (!m_singleFolderToUpdate)
AdvanceToFirstIMAPFolder();
{
m_currentServer = nsnull;
AdvanceToNextFolder();
}
if (m_singleFolderToUpdate)
{
m_singleFolderToUpdate->ClearFlag(MSG_FOLDER_FLAG_OFFLINEEVENTS);