fix mark read filters unread count handling r=cavin, sr=sspitzer

This commit is contained in:
bienvenu%netscape.com 2002-11-16 18:38:35 +00:00
Родитель a3b420bc30
Коммит cd2cb3c439
2 изменённых файлов: 107 добавлений и 88 удалений

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

@ -118,87 +118,88 @@ public:
nsresult SetUint32Property(nsIMdbRow *row, const char *propertyName, PRUint32 propertyVal);
// helper function for once we have the token.
nsresult SetNSStringPropertyWithToken(nsIMdbRow *row, mdb_token aProperty, nsString *propertyStr);
// helper functions to put values in cells for the passed-in row
nsresult UInt32ToRowCellColumn(nsIMdbRow *row, mdb_token columnToken, PRUint32 value);
nsresult CharPtrToRowCellColumn(nsIMdbRow *row, mdb_token columnToken, const char *charPtr);
nsresult RowCellColumnToCharPtr(nsIMdbRow *row, mdb_token columnToken, char **result);
// helper functions to copy an nsString to a yarn, int32 to yarn, and vice versa.
static struct mdbYarn *nsStringToYarn(struct mdbYarn *yarn, nsString *str);
static struct mdbYarn *UInt32ToYarn(struct mdbYarn *yarn, PRUint32 i);
static void YarnTonsString(struct mdbYarn *yarn, nsString *str);
static void YarnTonsCString(struct mdbYarn *yarn, nsCString *str);
static void YarnToUInt32(struct mdbYarn *yarn, PRUint32 *i);
// helper functions to convert a 64bits PRTime into a 32bits value (compatible time_t) and vice versa.
static void PRTime2Seconds(PRTime prTime, PRUint32 *seconds);
static void Seconds2PRTime(PRUint32 seconds, PRTime *prTime);
static void CleanupCache();
// helper functions to put values in cells for the passed-in row
nsresult UInt32ToRowCellColumn(nsIMdbRow *row, mdb_token columnToken, PRUint32 value);
nsresult CharPtrToRowCellColumn(nsIMdbRow *row, mdb_token columnToken, const char *charPtr);
nsresult RowCellColumnToCharPtr(nsIMdbRow *row, mdb_token columnToken, char **result);
// helper functions to copy an nsString to a yarn, int32 to yarn, and vice versa.
static struct mdbYarn *nsStringToYarn(struct mdbYarn *yarn, nsString *str);
static struct mdbYarn *UInt32ToYarn(struct mdbYarn *yarn, PRUint32 i);
static void YarnTonsString(struct mdbYarn *yarn, nsString *str);
static void YarnTonsCString(struct mdbYarn *yarn, nsCString *str);
static void YarnToUInt32(struct mdbYarn *yarn, PRUint32 *i);
// helper functions to convert a 64bits PRTime into a 32bits value (compatible time_t) and vice versa.
static void PRTime2Seconds(PRTime prTime, PRUint32 *seconds);
static void Seconds2PRTime(PRUint32 seconds, PRTime *prTime);
static void CleanupCache();
#ifdef DEBUG
static int GetNumInCache(void) {return(GetDBCache()->Count());}
static void DumpCache();
virtual nsresult DumpContents();
nsresult DumpThread(nsMsgKey threadId);
nsresult DumpMsgChildren(nsIMsgDBHdr *msgHdr);
static int GetNumInCache(void) {return(GetDBCache()->Count());}
static void DumpCache();
virtual nsresult DumpContents();
nsresult DumpThread(nsMsgKey threadId);
nsresult DumpMsgChildren(nsIMsgDBHdr *msgHdr);
#endif
friend class nsMsgHdr; // use this to get access to cached tokens for hdr fields
friend class nsMsgThread; // use this to get access to cached tokens for hdr fields
friend class nsMsgDBEnumerator;
friend class nsMsgDBThreadEnumerator;
friend class nsMsgHdr; // use this to get access to cached tokens for hdr fields
friend class nsMsgThread; // use this to get access to cached tokens for hdr fields
friend class nsMsgDBEnumerator;
friend class nsMsgDBThreadEnumerator;
protected:
// prefs stuff - in future, we might want to cache the prefs interface
nsresult GetBoolPref(const char *prefName, PRBool *result);
// retrieval methods
nsIMsgThread * GetThreadForReference(nsCString &msgID, nsIMsgDBHdr **pMsgHdr);
nsIMsgThread * GetThreadForSubject(nsCString &subject);
nsIMsgThread * GetThreadForThreadId(nsMsgKey threadId);
nsMsgHdr * GetMsgHdrForReference(nsCString &reference);
nsIMsgDBHdr * GetMsgHdrForSubject(nsCString &msgID);
// threading interfaces
virtual nsresult CreateNewThread(nsMsgKey key, const char *subject, nsMsgThread **newThread);
virtual PRBool ThreadBySubjectWithoutRe();
virtual nsresult ThreadNewHdr(nsMsgHdr* hdr, PRBool &newThread);
virtual nsresult AddNewThread(nsMsgHdr *msgHdr);
virtual nsresult AddToThread(nsMsgHdr *newHdr, nsIMsgThread *thread, nsIMsgDBHdr *pMsgHdr, PRBool threadInThread);
// open db cache
static void AddToCache(nsMsgDatabase* pMessageDB)
{GetDBCache()->AppendElement(pMessageDB);}
static void RemoveFromCache(nsMsgDatabase* pMessageDB);
static int FindInCache(nsMsgDatabase* pMessageDB);
PRBool MatchDbName(nsFileSpec &dbName); // returns TRUE if they match
// prefs stuff - in future, we might want to cache the prefs interface
nsresult GetBoolPref(const char *prefName, PRBool *result);
nsresult GetIntPref(const char *prefName, PRInt32 *result);
// retrieval methods
nsIMsgThread * GetThreadForReference(nsCString &msgID, nsIMsgDBHdr **pMsgHdr);
nsIMsgThread * GetThreadForSubject(nsCString &subject);
nsIMsgThread * GetThreadForThreadId(nsMsgKey threadId);
nsMsgHdr * GetMsgHdrForReference(nsCString &reference);
nsIMsgDBHdr * GetMsgHdrForSubject(nsCString &msgID);
// threading interfaces
virtual nsresult CreateNewThread(nsMsgKey key, const char *subject, nsMsgThread **newThread);
virtual PRBool ThreadBySubjectWithoutRe();
virtual nsresult ThreadNewHdr(nsMsgHdr* hdr, PRBool &newThread);
virtual nsresult AddNewThread(nsMsgHdr *msgHdr);
virtual nsresult AddToThread(nsMsgHdr *newHdr, nsIMsgThread *thread, nsIMsgDBHdr *pMsgHdr, PRBool threadInThread);
// open db cache
static void AddToCache(nsMsgDatabase* pMessageDB)
{GetDBCache()->AppendElement(pMessageDB);}
static void RemoveFromCache(nsMsgDatabase* pMessageDB);
static int FindInCache(nsMsgDatabase* pMessageDB);
PRBool MatchDbName(nsFileSpec &dbName); // returns TRUE if they match
#if defined(XP_PC) || defined(XP_MAC) // this should go away when we can provide our own file stream to MDB/Mork
static void UnixToNative(char*& ioPath);
static void UnixToNative(char*& ioPath);
#endif
// Flag handling routines
virtual nsresult SetKeyFlag(nsMsgKey key, PRBool set, PRUint32 flag,
nsIDBChangeListener *instigator = NULL);
virtual nsresult SetMsgHdrFlag(nsIMsgDBHdr *msgHdr, PRBool set, PRUint32 flag,
nsIDBChangeListener *instigator);
virtual PRBool SetHdrFlag(nsIMsgDBHdr *, PRBool bSet, MsgFlags flag);
virtual PRBool SetHdrReadFlag(nsIMsgDBHdr *, PRBool pRead);
virtual PRUint32 GetStatusFlags(nsIMsgDBHdr *msgHdr, PRUint32 origFlags);
// helper function which doesn't involve thread object
virtual nsresult RemoveHeaderFromDB(nsMsgHdr *msgHdr);
// Flag handling routines
virtual nsresult SetKeyFlag(nsMsgKey key, PRBool set, PRUint32 flag,
nsIDBChangeListener *instigator = NULL);
virtual nsresult SetMsgHdrFlag(nsIMsgDBHdr *msgHdr, PRBool set, PRUint32 flag,
nsIDBChangeListener *instigator);
virtual PRBool SetHdrFlag(nsIMsgDBHdr *, PRBool bSet, MsgFlags flag);
virtual PRBool SetHdrReadFlag(nsIMsgDBHdr *, PRBool pRead);
virtual PRUint32 GetStatusFlags(nsIMsgDBHdr *msgHdr, PRUint32 origFlags);
// helper function which doesn't involve thread object
virtual nsresult RemoveHeaderFromDB(nsMsgHdr *msgHdr);
virtual nsresult RemoveHeaderFromThread(nsMsgHdr *msgHdr);
virtual nsresult AdjustExpungedBytesOnDelete(nsIMsgDBHdr *msgHdr);
static nsVoidArray/*<nsMsgDatabase>*/* GetDBCache();
static nsVoidArray/*<nsMsgDatabase>*/* m_dbCache;
nsCOMPtr <nsICollation> m_collationKeyGenerator;
nsCOMPtr <nsIMimeConverter> m_mimeConverter;
virtual nsresult AdjustExpungedBytesOnDelete(nsIMsgDBHdr *msgHdr);
static nsVoidArray/*<nsMsgDatabase>*/* GetDBCache();
static nsVoidArray/*<nsMsgDatabase>*/* m_dbCache;
nsCOMPtr <nsICollation> m_collationKeyGenerator;
nsCOMPtr <nsIMimeConverter> m_mimeConverter;
nsCOMPtr <nsIMsgRetentionSettings> m_retentionSettings;
nsCOMPtr <nsIMsgDownloadSettings> m_downloadSettings;

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

@ -1720,13 +1720,14 @@ nsresult nsMsgDatabase::MarkHdrReadInDB(nsIMsgDBHdr *msgHdr, PRBool bRead,
nsresult rv;
nsMsgKey key;
PRUint32 oldFlags;
PRBool hdrInDB;
(void)msgHdr->GetMessageKey(&key);
msgHdr->GetFlags(&oldFlags);
if (m_newSet)
m_newSet->Remove(key);
if (m_dbFolderInfo != NULL)
(void) ContainsKey(key, &hdrInDB);
if (hdrInDB && m_dbFolderInfo)
{
if (bRead)
m_dbFolderInfo->ChangeNumNewMessages(-1);
@ -3683,22 +3684,36 @@ nsresult nsMsgDatabase::AddNewThread(nsMsgHdr *msgHdr)
// I imagine we might have separate preferences for mail and news, so this is a virtual method.
PRBool nsMsgDatabase::ThreadBySubjectWithoutRe()
{
return PR_TRUE;
return PR_TRUE;
}
nsresult nsMsgDatabase::GetBoolPref(const char *prefName, PRBool *result)
{
PRBool prefValue = PR_FALSE;
nsresult rv;
nsCOMPtr<nsIPref> prefs(do_GetService(kPrefCID, &rv));
if (NS_SUCCEEDED(rv) && prefs)
{
rv = prefs->GetBoolPref(prefName, &prefValue);
*result = prefValue;
}
return rv;
PRBool prefValue = PR_FALSE;
nsresult rv;
nsCOMPtr<nsIPref> prefs(do_GetService(kPrefCID, &rv));
if (NS_SUCCEEDED(rv) && prefs)
{
rv = prefs->GetBoolPref(prefName, &prefValue);
*result = prefValue;
}
return rv;
}
nsresult nsMsgDatabase::GetIntPref(const char *prefName, PRInt32 *result)
{
PRInt32 prefValue = 0;
nsresult rv;
nsCOMPtr<nsIPref> prefs(do_GetService(kPrefCID, &rv));
if (NS_SUCCEEDED(rv) && prefs)
{
rv = prefs->GetIntPref(prefName, &prefValue);
*result = prefValue;
}
return rv;
}
nsresult nsMsgDatabase::ListAllThreads(nsMsgKeyArray *threadIds)
{
nsresult rv;
@ -3794,8 +3809,11 @@ NS_IMETHODIMP nsMsgDatabase::ListAllOfflineDeletes(nsMsgKeyArray *offlineDeletes
}
NS_IMETHODIMP nsMsgDatabase::GetHighWaterArticleNum(nsMsgKey *key)
{
return NS_ERROR_NOT_IMPLEMENTED;
if (!m_dbFolderInfo)
return NS_ERROR_NULL_POINTER;
return m_dbFolderInfo->GetHighWater(key);
}
NS_IMETHODIMP nsMsgDatabase::GetLowWaterArticleNum(nsMsgKey *key)
{
return NS_ERROR_NOT_IMPLEMENTED;