get imap folder server flags set in database

This commit is contained in:
bienvenu%netscape.com 1999-04-20 04:59:33 +00:00
Родитель 411dd4b228
Коммит 454d0fcbe1
5 изменённых файлов: 112 добавлений и 2 удалений

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

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