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,
nsIDBChangeListener *instigator = NULL);
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
NS_IMETHOD MarkHdrReadInDB(nsIMsgDBHdr *msgHdr, PRBool bRead,
nsIDBChangeListener *instigator);

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

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

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

@ -1099,10 +1099,9 @@ nsresult nsMsgDatabase::IsRead(nsMsgKey key, PRBool *pRead)
return rv;
}
PRUint32 nsMsgDatabase::GetStatusFlags(nsIMsgDBHdr *msgHdr)
PRUint32 nsMsgDatabase::GetStatusFlags(nsIMsgDBHdr *msgHdr, PRUint32 origFlags)
{
PRUint32 statusFlags;
(void)msgHdr->GetFlags(&statusFlags);
PRUint32 statusFlags = origFlags;
PRBool isRead;
nsMsgKey key;
@ -1114,13 +1113,15 @@ PRUint32 nsMsgDatabase::GetStatusFlags(nsIMsgDBHdr *msgHdr)
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;
nsMsgHdr* hdr = NS_STATIC_CAST(nsMsgHdr*, msgHdr); // closed system, cast ok
// can't call GetFlags, because it will be recursive.
PRUint32 flags;
(void)hdr->GetFlags(&flags);
hdr->GetRawFlags(&flags);
*pRead = (flags & MSG_FLAG_READ) != 0;
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)
{
// 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;
if ((flagAlreadySet && !bSet) || (!flagAlreadySet && bSet))

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

@ -166,11 +166,22 @@ NS_IMETHODIMP nsMsgHdr::SetMessageKey(nsMsgKey value)
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)
{
if (!(m_initedValues & FLAGS_INITED))
InitFlags();
*result = m_flags;
if (m_mdb)
*result = m_mdb->GetStatusFlags(this, m_flags);
else
*result = m_flags;
return NS_OK;
}