зеркало из https://github.com/mozilla/gecko-dev.git
get imap folder server flags set in database
This commit is contained in:
Родитель
411dd4b228
Коммит
454d0fcbe1
|
@ -69,6 +69,9 @@ public:
|
|||
|
||||
NS_IMETHOD NotifyHdrsToDownload(PRUint32 *keys, PRUint32 keyCount) = 0;
|
||||
NS_IMETHOD NotifyBodysToDownload(PRUint32 *keys, PRUint32 keyCount) = 0;
|
||||
// methods to get data from the imap parser flag state.
|
||||
NS_IMETHOD GetFlagsForUID(PRUint32 uid, PRBool *foundIt, imapMessageFlagsType *flags) = 0;
|
||||
NS_IMETHOD GetSupportedUserFlags(PRUint16 *flags) = 0;
|
||||
};
|
||||
|
||||
#endif /* nsIImapProtocol_h___ */
|
||||
|
|
|
@ -33,10 +33,13 @@ NS_IMETHODIMP nsImapFlagAndUidState::GetUidOfMessage(PRInt32 zeroBasedIndex, PRU
|
|||
{
|
||||
if (!result)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
PR_CEnterMonitor(this);
|
||||
if (zeroBasedIndex < fNumberOfMessagesAdded)
|
||||
*result = fUids[zeroBasedIndex];
|
||||
else
|
||||
*result = -1; // so that value is non-zero and we don't ask for bad msgs
|
||||
PR_CExitMonitor(this);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -102,8 +105,10 @@ nsImapFlagAndUidState::SetSupportedUserFlags(uint16 flags)
|
|||
|
||||
void nsImapFlagAndUidState::Reset(PRUint32 howManyLeft)
|
||||
{
|
||||
PR_CEnterMonitor(this);
|
||||
if (!howManyLeft)
|
||||
fNumberOfMessagesAdded = fNumberDeleted = 0; // used space is still here
|
||||
PR_CExitMonitor(this);
|
||||
}
|
||||
|
||||
|
||||
|
@ -115,6 +120,8 @@ void nsImapFlagAndUidState::ExpungeByIndex(PRUint32 index)
|
|||
|
||||
if ((PRUint32) fNumberOfMessagesAdded < index)
|
||||
return;
|
||||
|
||||
PR_CEnterMonitor(this);
|
||||
index--;
|
||||
fNumberOfMessagesAdded--;
|
||||
if (fFlags[index] & kImapMsgDeletedFlag) // see if we already had counted this one as deleted
|
||||
|
@ -124,12 +131,14 @@ void nsImapFlagAndUidState::ExpungeByIndex(PRUint32 index)
|
|||
fUids.SetAt(counter, fUids[counter + 1]);
|
||||
fFlags[counter] = fFlags[counter + 1];
|
||||
}
|
||||
PR_CExitMonitor(this);
|
||||
}
|
||||
|
||||
|
||||
// adds to sorted list. protects against duplicates and going past fNumberOfMessageSlotsAllocated
|
||||
void nsImapFlagAndUidState::AddUidFlagPair(PRUint32 uid, imapMessageFlagsType flags)
|
||||
{
|
||||
PR_CEnterMonitor(this);
|
||||
// make sure there is room for this pair
|
||||
if (fNumberOfMessagesAdded >= fNumberOfMessageSlotsAllocated)
|
||||
{
|
||||
|
@ -146,6 +155,7 @@ void nsImapFlagAndUidState::AddUidFlagPair(PRUint32 uid, imapMessageFlagsType fl
|
|||
fNumberOfMessagesAdded++;
|
||||
if (flags & kImapMsgDeletedFlag)
|
||||
fNumberDeleted++;
|
||||
PR_CExitMonitor(this);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -178,6 +188,7 @@ void nsImapFlagAndUidState::AddUidFlagPair(PRUint32 uid, imapMessageFlagsType fl
|
|||
fNumberDeleted++;
|
||||
fFlags[insertionIndex] = flags;
|
||||
}
|
||||
PR_CExitMonitor(this);
|
||||
}
|
||||
|
||||
|
||||
|
@ -226,6 +237,8 @@ PRBool nsImapFlagAndUidState::IsLastMessageUnseen()
|
|||
|
||||
imapMessageFlagsType nsImapFlagAndUidState::GetMessageFlagsFromUID(PRUint32 uid, PRBool *foundIt, PRInt32 *ndx)
|
||||
{
|
||||
PR_CEnterMonitor(this);
|
||||
|
||||
PRInt32 index = 0;
|
||||
PRInt32 hi = fNumberOfMessagesAdded - 1;
|
||||
PRInt32 lo = 0;
|
||||
|
@ -241,6 +254,7 @@ imapMessageFlagsType nsImapFlagAndUidState::GetMessageFlagsFromUID(PRUint32 uid,
|
|||
|
||||
*foundIt = TRUE;
|
||||
*ndx = index;
|
||||
PR_CExitMonitor(this);
|
||||
return returnFlags;
|
||||
}
|
||||
if (fUids[index] > (PRUint32) uid)
|
||||
|
@ -254,6 +268,7 @@ imapMessageFlagsType nsImapFlagAndUidState::GetMessageFlagsFromUID(PRUint32 uid,
|
|||
if (index < 0)
|
||||
index = 0;
|
||||
*ndx = index;
|
||||
PR_CExitMonitor(this);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -2565,7 +2565,25 @@ NS_IMETHODIMP nsImapProtocol::NotifyBodysToDownload(PRUint32 *keys, PRUint32 key
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsImapProtocol::GetFlagsForUID(PRUint32 uid, PRBool *foundIt, imapMessageFlagsType *resultFlags)
|
||||
{
|
||||
PRInt32 index;
|
||||
|
||||
imapMessageFlagsType flags = -1;
|
||||
flags = m_flagState.GetMessageFlagsFromUID(uid, foundIt, &index);
|
||||
if (*foundIt)
|
||||
*resultFlags = flags;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsImapProtocol::GetSupportedUserFlags(PRUint16 *supportedFlags)
|
||||
{
|
||||
if (!supportedFlags)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*supportedFlags = m_flagState.GetSupportedUserFlags();
|
||||
return NS_OK;
|
||||
}
|
||||
void nsImapProtocol::FolderMsgDumpLoop(PRUint32 *msgUids, PRUint32 msgCount, nsIMAPeFetchFields fields)
|
||||
{
|
||||
// PastPasswordCheckEvent();
|
||||
|
|
|
@ -93,6 +93,9 @@ public:
|
|||
// about headers it should download to update a local database.
|
||||
NS_IMETHOD NotifyHdrsToDownload(PRUint32 *keys, PRUint32 keyCount);
|
||||
NS_IMETHOD NotifyBodysToDownload(PRUint32 *keys, PRUint32 keyCount);
|
||||
|
||||
NS_IMETHOD GetFlagsForUID(PRUint32 uid, PRBool *foundIt, imapMessageFlagsType *flags);
|
||||
NS_IMETHOD GetSupportedUserFlags(PRUint16 *flags);
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
// End of nsIStreamListenerSupport
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -270,6 +270,7 @@ protected:
|
|||
nsIImapProtocol * m_IMAP4Protocol; // running protocol instance
|
||||
nsParseMailMessageState *m_msgParser ;
|
||||
nsMsgKey m_curMsgUid;
|
||||
PRInt32 m_nextMessageByteLength;
|
||||
nsIMsgDatabase * m_mailDB ;
|
||||
PRBool m_runTestHarness;
|
||||
PRBool m_runningURL; // are we currently running a url? this flag is set to false when the url finishes...
|
||||
|
@ -281,6 +282,7 @@ protected:
|
|||
void FindKeysToAdd(const nsMsgKeyArray &existingKeys, nsMsgKeyArray &keysToFetch, nsImapFlagAndUidState *flagState);
|
||||
void FindKeysToDelete(const nsMsgKeyArray &existingKeys, nsMsgKeyArray &keysToFetch, nsImapFlagAndUidState *flagState);
|
||||
void PrepareToAddHeadersToMailDB(nsIImapProtocol* aProtocol, const nsMsgKeyArray &keysToFetch, mailbox_spec *boxSpec);
|
||||
void TweakHeaderFlags(nsIImapProtocol* aProtocol, nsIMessage *tweakMe);
|
||||
|
||||
};
|
||||
|
||||
|
@ -707,6 +709,8 @@ NS_IMETHODIMP nsIMAP4TestDriver::SetupHeaderParseStream(nsIImapProtocol* aProtoc
|
|||
StreamInfo* aStreamInfo)
|
||||
{
|
||||
printf("**** nsIMAP4TestDriver::SetupHeaderParseStream\r\n");
|
||||
|
||||
m_nextMessageByteLength = aStreamInfo->size;
|
||||
if (!m_msgParser)
|
||||
{
|
||||
m_msgParser = new nsParseMailMessageState;
|
||||
|
@ -758,9 +762,10 @@ NS_IMETHODIMP nsIMAP4TestDriver::ParseAdoptedHeaderLine(nsIImapProtocol* aProtoc
|
|||
NS_IMETHODIMP nsIMAP4TestDriver::NormalEndHeaderParseStream(nsIImapProtocol* aProtocol)
|
||||
{
|
||||
printf("**** nsIMAP4TestDriver::NormalEndHeaderParseStream\r\n");
|
||||
if (m_msgParser)
|
||||
if (m_msgParser && m_msgParser->m_newMsgHdr)
|
||||
{
|
||||
m_msgParser->m_newMsgHdr->SetMessageKey(m_curMsgUid);
|
||||
TweakHeaderFlags(aProtocol, m_msgParser->m_newMsgHdr);
|
||||
// here we need to tweak flags from uid state..
|
||||
m_mailDB->AddNewHdrToDB(m_msgParser->m_newMsgHdr, PR_TRUE);
|
||||
m_msgParser->FinishHeader();
|
||||
|
@ -777,7 +782,73 @@ NS_IMETHODIMP nsIMAP4TestDriver::AbortHeaderParseStream(nsIImapProtocol* aProtoc
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
void nsIMAP4TestDriver::TweakHeaderFlags(nsIImapProtocol* aProtocol, nsIMessage *tweakMe)
|
||||
{
|
||||
if (m_mailDB && aProtocol && tweakMe)
|
||||
{
|
||||
tweakMe->SetMessageKey(m_curMsgUid);
|
||||
tweakMe->SetMessageSize(m_nextMessageByteLength);
|
||||
|
||||
PRBool foundIt = FALSE;
|
||||
imapMessageFlagsType imap_flags;
|
||||
nsresult res = aProtocol->GetFlagsForUID(m_curMsgUid, &foundIt, &imap_flags);
|
||||
if (NS_SUCCEEDED(res) && foundIt)
|
||||
{
|
||||
// make a mask and clear these message flags
|
||||
PRUint32 mask = MSG_FLAG_READ | MSG_FLAG_REPLIED | MSG_FLAG_MARKED | MSG_FLAG_IMAP_DELETED;
|
||||
PRUint32 dbHdrFlags;
|
||||
|
||||
tweakMe->GetFlags(&dbHdrFlags);
|
||||
tweakMe->AndFlags(~mask, &dbHdrFlags);
|
||||
|
||||
// set the new value for these flags
|
||||
PRUint32 newFlags = 0;
|
||||
if (imap_flags & kImapMsgSeenFlag)
|
||||
newFlags |= MSG_FLAG_READ;
|
||||
else // if (imap_flags & kImapMsgRecentFlag)
|
||||
newFlags |= MSG_FLAG_NEW;
|
||||
|
||||
// Okay here is the MDN needed logic (if DNT header seen):
|
||||
/* if server support user defined flag:
|
||||
MDNSent flag set => clear kMDNNeeded flag
|
||||
MDNSent flag not set => do nothing, leave kMDNNeeded on
|
||||
else if
|
||||
not MSG_FLAG_NEW => clear kMDNNeeded flag
|
||||
MSG_FLAG_NEW => do nothing, leave kMDNNeeded on
|
||||
*/
|
||||
PRUint16 userFlags;
|
||||
nsresult res = aProtocol->GetSupportedUserFlags(&userFlags);
|
||||
if (NS_SUCCEEDED(res) && (userFlags & (kImapMsgSupportUserFlag |
|
||||
kImapMsgSupportMDNSentFlag)))
|
||||
{
|
||||
if (imap_flags & kImapMsgMDNSentFlag)
|
||||
{
|
||||
newFlags |= MSG_FLAG_MDN_REPORT_SENT;
|
||||
if (dbHdrFlags & MSG_FLAG_MDN_REPORT_NEEDED)
|
||||
tweakMe->AndFlags(~MSG_FLAG_MDN_REPORT_NEEDED, &dbHdrFlags);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(imap_flags & kImapMsgRecentFlag) &&
|
||||
dbHdrFlags & MSG_FLAG_MDN_REPORT_NEEDED)
|
||||
tweakMe->AndFlags(~MSG_FLAG_MDN_REPORT_NEEDED, &dbHdrFlags);
|
||||
}
|
||||
|
||||
if (imap_flags & kImapMsgAnsweredFlag)
|
||||
newFlags |= MSG_FLAG_REPLIED;
|
||||
if (imap_flags & kImapMsgFlaggedFlag)
|
||||
newFlags |= MSG_FLAG_MARKED;
|
||||
if (imap_flags & kImapMsgDeletedFlag)
|
||||
newFlags |= MSG_FLAG_IMAP_DELETED;
|
||||
if (imap_flags & kImapMsgForwardedFlag)
|
||||
newFlags |= MSG_FLAG_FORWARDED;
|
||||
|
||||
if (newFlags)
|
||||
tweakMe->OrFlags(newFlags, &dbHdrFlags);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// nsIImapMessageSink support
|
||||
NS_IMETHODIMP
|
||||
|
|
Загрузка…
Ссылка в новой задаче