fix new flag handling, r=putterman

This commit is contained in:
bienvenu%netscape.com 2000-01-07 00:24:35 +00:00
Родитель c215dee1c7
Коммит b820ad8a58
4 изменённых файлов: 24 добавлений и 9 удалений

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

@ -279,7 +279,7 @@ protected:
virtual nsresult SetKeyFlag(nsMsgKey key, PRBool set, PRUint32 flag, virtual nsresult SetKeyFlag(nsMsgKey key, PRBool set, PRUint32 flag,
nsIDBChangeListener *instigator = NULL); nsIDBChangeListener *instigator = NULL);
virtual PRBool SetHdrFlag(nsIMsgDBHdr *, PRBool bSet, MsgFlags flag); virtual PRBool SetHdrFlag(nsIMsgDBHdr *, PRBool bSet, MsgFlags flag);
virtual PRUint32 GetStatusFlags(nsIMsgDBHdr *msgHdr); virtual PRUint32 GetStatusFlags(nsIMsgDBHdr *msgHdr, PRUint32 origFlags);
// helper function which doesn't involve thread object // helper function which doesn't involve thread object
NS_IMETHOD MarkHdrReadInDB(nsIMsgDBHdr *msgHdr, PRBool bRead, NS_IMETHOD MarkHdrReadInDB(nsIMsgDBHdr *msgHdr, PRBool bRead,
nsIDBChangeListener *instigator); nsIDBChangeListener *instigator);

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

@ -101,6 +101,7 @@ public:
nsMsgHdr(nsMsgDatabase *db, nsIMdbRow *dbRow); nsMsgHdr(nsMsgDatabase *db, nsIMdbRow *dbRow);
virtual ~nsMsgHdr(); virtual ~nsMsgHdr();
virtual nsresult GetRawFlags(PRUint32 *result);
void Init(); void Init();
virtual nsresult InitCachedValues(); virtual nsresult InitCachedValues();
virtual nsresult InitFlags(); virtual nsresult InitFlags();

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

@ -1099,10 +1099,9 @@ nsresult nsMsgDatabase::IsRead(nsMsgKey key, PRBool *pRead)
return rv; return rv;
} }
PRUint32 nsMsgDatabase::GetStatusFlags(nsIMsgDBHdr *msgHdr) PRUint32 nsMsgDatabase::GetStatusFlags(nsIMsgDBHdr *msgHdr, PRUint32 origFlags)
{ {
PRUint32 statusFlags; PRUint32 statusFlags = origFlags;
(void)msgHdr->GetFlags(&statusFlags);
PRBool isRead; PRBool isRead;
nsMsgKey key; nsMsgKey key;
@ -1114,13 +1113,15 @@ PRUint32 nsMsgDatabase::GetStatusFlags(nsIMsgDBHdr *msgHdr)
return statusFlags; return statusFlags;
} }
NS_IMETHODIMP nsMsgDatabase::IsHeaderRead(nsIMsgDBHdr *hdr, PRBool *pRead) NS_IMETHODIMP nsMsgDatabase::IsHeaderRead(nsIMsgDBHdr *msgHdr, PRBool *pRead)
{ {
if (!hdr) if (!msgHdr)
return NS_MSG_MESSAGE_NOT_FOUND; return NS_MSG_MESSAGE_NOT_FOUND;
nsMsgHdr* hdr = NS_STATIC_CAST(nsMsgHdr*, msgHdr); // closed system, cast ok
// can't call GetFlags, because it will be recursive.
PRUint32 flags; PRUint32 flags;
(void)hdr->GetFlags(&flags); hdr->GetRawFlags(&flags);
*pRead = (flags & MSG_FLAG_READ) != 0; *pRead = (flags & MSG_FLAG_READ) != 0;
return NS_OK; return NS_OK;
} }
@ -1353,7 +1354,9 @@ nsresult nsMsgDatabase::SetKeyFlag(nsMsgKey key, PRBool set, PRUint32 flag,
PRBool nsMsgDatabase::SetHdrFlag(nsIMsgDBHdr *msgHdr, PRBool bSet, MsgFlags flag) PRBool nsMsgDatabase::SetHdrFlag(nsIMsgDBHdr *msgHdr, PRBool bSet, MsgFlags flag)
{ {
// PR_ASSERT(! (flag & kDirty)); // this won't do the right thing so don't. // PR_ASSERT(! (flag & kDirty)); // this won't do the right thing so don't.
PRUint32 currentStatusFlags = GetStatusFlags(msgHdr); PRUint32 statusFlags;
(void)msgHdr->GetFlags(&statusFlags);
PRUint32 currentStatusFlags = GetStatusFlags(msgHdr, statusFlags);
PRBool flagAlreadySet = (currentStatusFlags & flag) != 0; PRBool flagAlreadySet = (currentStatusFlags & flag) != 0;
if ((flagAlreadySet && !bSet) || (!flagAlreadySet && bSet)) if ((flagAlreadySet && !bSet) || (!flagAlreadySet && bSet))

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

@ -166,10 +166,21 @@ NS_IMETHODIMP nsMsgHdr::SetMessageKey(nsMsgKey value)
return NS_OK; return NS_OK;
} }
nsresult nsMsgHdr::GetRawFlags(PRUint32 *result)
{
if (!(m_initedValues & FLAGS_INITED))
InitFlags();
*result = m_flags;
return NS_OK;
}
NS_IMETHODIMP nsMsgHdr::GetFlags(PRUint32 *result) NS_IMETHODIMP nsMsgHdr::GetFlags(PRUint32 *result)
{ {
if (!(m_initedValues & FLAGS_INITED)) if (!(m_initedValues & FLAGS_INITED))
InitFlags(); InitFlags();
if (m_mdb)
*result = m_mdb->GetStatusFlags(this, m_flags);
else
*result = m_flags; *result = m_flags;
return NS_OK; return NS_OK;
} }