зеркало из https://github.com/mozilla/gecko-dev.git
fix new flag handling, r=putterman
This commit is contained in:
Родитель
c215dee1c7
Коммит
b820ad8a58
|
@ -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,11 +166,22 @@ 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();
|
||||||
*result = m_flags;
|
if (m_mdb)
|
||||||
|
*result = m_mdb->GetStatusFlags(this, m_flags);
|
||||||
|
else
|
||||||
|
*result = m_flags;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче