зеркало из https://github.com/mozilla/gecko-dev.git
fix one part of problem playing back offline moves from imap to local folders, 364082, sr=mscott
This commit is contained in:
Родитель
49dfbc8990
Коммит
10903030c5
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче