From b820ad8a587d371c7352348471638310e0fe112b Mon Sep 17 00:00:00 2001 From: "bienvenu%netscape.com" Date: Fri, 7 Jan 2000 00:24:35 +0000 Subject: [PATCH] fix new flag handling, r=putterman --- mailnews/db/msgdb/public/nsMsgDatabase.h | 2 +- mailnews/db/msgdb/public/nsMsgHdr.h | 1 + mailnews/db/msgdb/src/nsMsgDatabase.cpp | 17 ++++++++++------- mailnews/db/msgdb/src/nsMsgHdr.cpp | 13 ++++++++++++- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/mailnews/db/msgdb/public/nsMsgDatabase.h b/mailnews/db/msgdb/public/nsMsgDatabase.h index 443e450423ff..608fcf45557a 100644 --- a/mailnews/db/msgdb/public/nsMsgDatabase.h +++ b/mailnews/db/msgdb/public/nsMsgDatabase.h @@ -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); diff --git a/mailnews/db/msgdb/public/nsMsgHdr.h b/mailnews/db/msgdb/public/nsMsgHdr.h index c605f39a1083..5fcf0ed4a18b 100644 --- a/mailnews/db/msgdb/public/nsMsgHdr.h +++ b/mailnews/db/msgdb/public/nsMsgHdr.h @@ -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(); diff --git a/mailnews/db/msgdb/src/nsMsgDatabase.cpp b/mailnews/db/msgdb/src/nsMsgDatabase.cpp index 898735a3ea74..fad51452b89a 100644 --- a/mailnews/db/msgdb/src/nsMsgDatabase.cpp +++ b/mailnews/db/msgdb/src/nsMsgDatabase.cpp @@ -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)) diff --git a/mailnews/db/msgdb/src/nsMsgHdr.cpp b/mailnews/db/msgdb/src/nsMsgHdr.cpp index 94deca4ec9fe..5cd7393d42a0 100644 --- a/mailnews/db/msgdb/src/nsMsgHdr.cpp +++ b/mailnews/db/msgdb/src/nsMsgHdr.cpp @@ -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; }