make dbFolderInfo an interface

This commit is contained in:
bienvenu%netscape.com 1999-02-24 02:56:11 +00:00
parent c70ba64725
commit 145c809d6c
7 changed files with 211 additions and 108 deletions

View File

@ -30,6 +30,7 @@ EXPORTS= \
nsNewsDatabase.h \
nsDBFolderInfo.h \
nsIDBChangeListener.h \
nsIDBFolderInfo.h \
nsIMessage.h \
$(NULL)

View File

@ -30,6 +30,7 @@ EXPORTS = \
nsDBFolderInfo.h \
nsMsgHdr.h \
nsIDBChangeListener.h \
nsIDBFolderInfo.h \
nsIMessage.h \
$(NULL)

View File

@ -27,6 +27,7 @@
#include "xp.h"
#include "mdb.h"
#include "nsMsgKeyArray.h"
#include "nsIDBFolderInfo.h"
class nsMsgDatabase;
@ -37,22 +38,48 @@ class nsMsgDatabase;
// caching the values. If this somehow turns out to be prohibitively expensive, we can invent
// some sort of dirty mechanism, but I think it turns out that these values will be cached by
// the MSG_FolderInfo's anyway.
class nsDBFolderInfo
class nsDBFolderInfo : public nsIDBFolderInfo
{
public:
friend class nsMsgDatabase;
nsDBFolderInfo(nsMsgDatabase *mdb);
virtual ~nsDBFolderInfo();
nsrefcnt AddRef(void);
nsrefcnt Release(void);
NS_DECL_ISUPPORTS
// interface methods.
NS_IMETHOD GetFlags(PRInt32 *result);
NS_IMETHOD SetFlags(PRInt32 flags);
NS_IMETHOD OrFlags(PRInt32 flags, PRInt32 *result);
NS_IMETHOD AndFlags(PRInt32 flags, PRInt32 *result);
NS_IMETHOD SetHighWater(nsMsgKey highWater, PRBool force = FALSE) ;
NS_IMETHOD GetHighWater(nsMsgKey *result) ;
NS_IMETHOD SetExpiredMark(nsMsgKey expiredKey);
NS_IMETHOD ChangeNumNewMessages(PRInt32 delta);
NS_IMETHOD ChangeNumMessages(PRInt32 delta);
NS_IMETHOD ChangeNumVisibleMessages(PRInt32 delta);
NS_IMETHOD GetNumNewMessages(PRInt32 *result) ;
NS_IMETHOD GetNumMessages(PRInt32 *result) ;
NS_IMETHOD GetNumVisibleMessages(PRInt32 *result) ;
NS_IMETHOD GetImapUidValidity(PRInt32 *result) ;
NS_IMETHOD SetImapUidValidity(PRInt32 uidValidity) ;
NS_IMETHOD SetVersion(PRUint16 version) ;
NS_IMETHOD GetLastMessageLoaded(nsMsgKey *result);
NS_IMETHOD SetLastMessageLoaded(nsMsgKey lastLoaded);
NS_IMETHOD SetFolderSize(PRUint32 size);
NS_IMETHOD SetFolderDate(time_t date);
NS_IMETHOD GetProperty(const char *propertyName, nsString &resultProperty);
NS_IMETHOD SetProperty(const char *propertyName, nsString &propertyStr);
NS_IMETHOD SetUint32Property(const char *propertyName, PRUint32 propertyValue);
NS_IMETHOD GetUint32Property(const char *propertyName, PRUint32 &propertyValue);
// create the appropriate table and row in a new db.
nsresult AddToNewMDB();
// accessor methods.
void SetHighWater(nsMsgKey highWater, PRBool force = FALSE) ;
nsMsgKey GetHighWater() ;
void SetExpiredMark(nsMsgKey expiredKey);
int GetDiskVersion();
PRBool AddLaterKey(nsMsgKey key, time_t *until);
@ -68,16 +95,6 @@ public:
// we would like to just store the property name we're sorted by
void SetSortInfo(nsMsgSortType, nsMsgSortOrder);
void GetSortInfo(nsMsgSortType *, nsMsgSortOrder *);
PRInt32 ChangeNumNewMessages(PRInt32 delta);
PRInt32 ChangeNumMessages(PRInt32 delta);
PRInt32 ChangeNumVisibleMessages(PRInt32 delta);
PRInt32 GetNumNewMessages() ;
PRInt32 GetNumMessages() ;
PRInt32 GetNumVisibleMessages() ;
PRInt32 GetFlags();
void SetFlags(PRInt32 flags);
void OrFlags(PRInt32 flags);
void AndFlags(PRInt32 flags);
PRBool TestFlag(PRInt32 flags);
PRInt16 GetCSID() ;
void SetCSID(PRInt16 csid) ;
@ -88,29 +105,15 @@ public:
PRInt32 GetImapUnreadPendingMessages() ;
void ChangeImapUnreadPendingMessages(PRInt32 delta) ;
PRInt32 GetImapUidValidity() ;
void SetImapUidValidity(PRInt32 uidValidity) ;
void SetVersion(PRUint16 version) {m_version = version;}
nsMsgKey GetLastMessageLoaded();
void SetLastMessageLoaded(nsMsgKey lastLoaded);
void SetFolderSize(PRUint32 size);
void SetFolderDate(time_t date);
virtual void SetKnownArtsSet(nsString &newsArtSet);
virtual void GetKnownArtsSet(nsString &newsArtSet);
// get and set arbitrary property, aka row cell value.
nsresult GetProperty(const char *propertyName, nsString &resultProperty);
nsresult SetProperty(const char *propertyName, nsString &propertyStr);
nsresult SetUint32Property(const char *propertyName, PRUint32 propertyValue);
nsresult SetPropertyWithToken(mdb_token aProperty, nsString &propertyStr);
nsresult SetUint32PropertyWithToken(mdb_token aProperty, PRUint32 propertyValue);
nsresult SetInt32PropertyWithToken(mdb_token aProperty, PRInt32 propertyValue);
nsresult GetPropertyWithToken(mdb_token aProperty, nsString &resultProperty);
nsresult GetUint32Property(const char *propertyName, PRUint32 &propertyValue);
nsresult GetUint32PropertyWithToken(mdb_token aProperty, PRUint32 &propertyValue);
nsresult GetInt32PropertyWithToken(mdb_token aProperty, PRInt32 &propertyValue);
@ -137,7 +140,6 @@ public:
nsMsgKeyArray m_lateredKeys; // list of latered messages
protected:
nsrefcnt mRefCnt;
// initialize from appropriate table and row in existing db.
nsresult InitFromExistingDB();

View File

@ -0,0 +1,68 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
* Reserved.
*/
#ifndef nsIDBFolderInfo_h__
#define nsIDBFolderInfo_h__
#include "MailNewsTypes.h"
#include "nsString.h"
#define NS_IDBFOLDERINFO_IID \
{ /* 5cb11c00-cb8b-11d2-8d67-00805f8a6617 */ \
0x5cb11c00, \
0xcb8b, \
0x11d2, \
{0x8d, 0x67, 0x00, 0x80, 0x5f, 0x8a, 0x66, 0x17} \
}
class nsIDBFolderInfo : public nsISupports {
public:
static const nsIID& IID() { static nsIID iid = NS_IDBFOLDERINFO_IID; return iid; }
NS_IMETHOD GetFlags(PRInt32 *result) ;
NS_IMETHOD SetFlags(PRInt32 flags) = 0;
NS_IMETHOD OrFlags(PRInt32 flags, PRInt32 *result) = 0;
NS_IMETHOD AndFlags(PRInt32 flags, PRInt32 *result) = 0;
NS_IMETHOD SetHighWater(nsMsgKey highWater, PRBool force = FALSE) = 0;
NS_IMETHOD GetHighWater(nsMsgKey *result) = 0;
NS_IMETHOD SetExpiredMark(nsMsgKey expiredKey) = 0;
NS_IMETHOD ChangeNumNewMessages(PRInt32 delta) = 0;
NS_IMETHOD ChangeNumMessages(PRInt32 delta) = 0;
NS_IMETHOD ChangeNumVisibleMessages(PRInt32 delta) = 0;
NS_IMETHOD GetNumNewMessages(PRInt32 *result) = 0;
NS_IMETHOD GetNumMessages(PRInt32 *result) = 0;
NS_IMETHOD GetNumVisibleMessages(PRInt32 *result) = 0;
NS_IMETHOD GetImapUidValidity(PRInt32 *result) = 0;
NS_IMETHOD SetImapUidValidity(PRInt32 uidValidity) = 0;
NS_IMETHOD SetVersion(PRUint16 version) = 0;
NS_IMETHOD GetLastMessageLoaded(nsMsgKey *result) = 0;
NS_IMETHOD SetLastMessageLoaded(nsMsgKey lastLoaded) = 0;
NS_IMETHOD SetFolderSize(PRUint32 size) = 0;
NS_IMETHOD SetFolderDate(time_t date) = 0;
NS_IMETHOD GetProperty(const char *propertyName, nsString &resultProperty) = 0;
NS_IMETHOD SetProperty(const char *propertyName, nsString &propertyStr) = 0;
NS_IMETHOD SetUint32Property(const char *propertyName, PRUint32 propertyValue) = 0;
NS_IMETHOD GetUint32Property(const char *propertyName, PRUint32 &propertyValue) = 0;
};
#endif // nsIDBFolderInfo_h__

View File

@ -42,6 +42,31 @@ static const char * kMailboxNameColumnName = "mailboxName";
static const char * kKnownArtsSetColumnName = "knownArts";
static const char * kExpiredMarkColumnName = "expiredMark";
// we need this because of an egcs 1.0 (and possibly gcc) compiler bug
// that doesn't allow you to call ::nsISupports::IID() inside of a class
// that multiply inherits from nsISupports
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
NS_IMPL_ADDREF(nsDBFolderInfo)
NS_IMPL_RELEASE(nsDBFolderInfo)
NS_IMETHODIMP
nsDBFolderInfo::QueryInterface(REFNSIID iid, void** result)
{
if (! result)
return NS_ERROR_NULL_POINTER;
*result = nsnull;
if(iid.Equals(nsIDBFolderInfo::IID()) ||
iid.Equals(kISupportsIID)) {
*result = NS_STATIC_CAST(nsIDBFolderInfo*, this);
AddRef();
return NS_OK;
}
return NS_NOINTERFACE;
}
nsDBFolderInfo::nsDBFolderInfo(nsMsgDatabase *mdb)
: m_folderDate(0) // now
{
@ -96,23 +121,6 @@ nsDBFolderInfo::~nsDBFolderInfo()
}
}
// ref counting methods - if we inherit from nsISupports, we won't need these,
// and we can take advantage of the nsISupports ref-counting tracing methods
nsrefcnt nsDBFolderInfo::AddRef(void)
{
return ++mRefCnt;
}
nsrefcnt nsDBFolderInfo::Release(void)
{
NS_PRECONDITION(0 != mRefCnt, "dup release");
if (--mRefCnt == 0)
{
delete this;
return 0;
}
return mRefCnt;
}
// this routine sets up a new db to know about the dbFolderInfo stuff...
nsresult nsDBFolderInfo::AddToNewMDB()
@ -218,36 +226,43 @@ nsresult nsDBFolderInfo::LoadMemberVariables()
return ret;
}
void nsDBFolderInfo::SetHighWater(nsMsgKey highWater, PRBool force /* = FALSE */)
NS_IMETHODIMP nsDBFolderInfo::SetVersion(PRUint16 version)
{
m_version = version;
return NS_OK;
}
NS_IMETHODIMP nsDBFolderInfo::SetHighWater(nsMsgKey highWater, PRBool force /* = FALSE */)
{
if (force || m_highWaterMessageKey < highWater)
{
m_highWaterMessageKey = highWater;
}
return NS_OK;
}
void nsDBFolderInfo::SetFolderSize(PRUint32 size)
NS_IMETHODIMP nsDBFolderInfo::SetFolderSize(PRUint32 size)
{
m_folderSize = size;
SetUint32PropertyWithToken(m_folderSizeColumnToken, m_folderSize);
return SetUint32PropertyWithToken(m_folderSizeColumnToken, m_folderSize);
}
void nsDBFolderInfo::SetFolderDate(time_t folderDate)
NS_IMETHODIMP nsDBFolderInfo::SetFolderDate(time_t folderDate)
{
m_folderDate = folderDate;
SetUint32PropertyWithToken(m_folderDateColumnToken, m_folderSize);
return SetUint32PropertyWithToken(m_folderDateColumnToken, m_folderSize);
}
nsMsgKey nsDBFolderInfo::GetHighWater()
NS_IMETHODIMP nsDBFolderInfo::GetHighWater(nsMsgKey *result)
{
return m_highWaterMessageKey;
*result = m_highWaterMessageKey;
return NS_OK;
}
void nsDBFolderInfo::SetExpiredMark(nsMsgKey expiredKey)
NS_IMETHODIMP nsDBFolderInfo::SetExpiredMark(nsMsgKey expiredKey)
{
m_expiredMark = expiredKey;
SetUint32PropertyWithToken(m_expiredMarkColumnToken, expiredKey);
return SetUint32PropertyWithToken(m_expiredMarkColumnToken, expiredKey);
}
int nsDBFolderInfo::GetDiskVersion()
@ -301,7 +316,7 @@ void nsDBFolderInfo::GetSortInfo(nsMsgSortType *type, nsMsgSortOrder *orde)
{
}
PRInt32 nsDBFolderInfo::ChangeNumNewMessages(PRInt32 delta)
NS_IMETHODIMP nsDBFolderInfo::ChangeNumNewMessages(PRInt32 delta)
{
m_numNewMessages += delta;
if (m_numNewMessages < 0)
@ -311,11 +326,10 @@ PRInt32 nsDBFolderInfo::ChangeNumNewMessages(PRInt32 delta)
#endif
m_numNewMessages = 0;
}
SetUint32PropertyWithToken(m_numNewMessagesColumnToken, m_numNewMessages);
return m_numNewMessages;
return SetUint32PropertyWithToken(m_numNewMessagesColumnToken, m_numNewMessages);
}
PRInt32 nsDBFolderInfo::ChangeNumMessages(PRInt32 delta)
NS_IMETHODIMP nsDBFolderInfo::ChangeNumMessages(PRInt32 delta)
{
m_numMessages += delta;
if (m_numMessages < 0)
@ -325,11 +339,10 @@ PRInt32 nsDBFolderInfo::ChangeNumMessages(PRInt32 delta)
#endif
m_numMessages = 0;
}
SetUint32PropertyWithToken(m_numMessagesColumnToken, m_numMessages);
return m_numMessages;
return SetUint32PropertyWithToken(m_numMessagesColumnToken, m_numMessages);
}
PRInt32 nsDBFolderInfo::ChangeNumVisibleMessages(PRInt32 delta)
NS_IMETHODIMP nsDBFolderInfo::ChangeNumVisibleMessages(PRInt32 delta)
{
m_numVisibleMessages += delta;
if (m_numVisibleMessages < 0)
@ -339,49 +352,81 @@ PRInt32 nsDBFolderInfo::ChangeNumVisibleMessages(PRInt32 delta)
#endif
m_numVisibleMessages = 0;
}
SetUint32PropertyWithToken(m_numVisibleMessagesColumnToken, m_numVisibleMessages);
return m_numVisibleMessages;
return SetUint32PropertyWithToken(m_numVisibleMessagesColumnToken, m_numVisibleMessages);
}
PRInt32 nsDBFolderInfo::GetNumNewMessages()
NS_IMETHODIMP nsDBFolderInfo::GetNumNewMessages(PRInt32 *result)
{
return m_numNewMessages;
*result = m_numNewMessages;
return NS_OK;
}
PRInt32 nsDBFolderInfo::GetNumMessages()
NS_IMETHODIMP nsDBFolderInfo::GetNumMessages(PRInt32 *result)
{
return m_numMessages;
}
PRInt32 nsDBFolderInfo::GetNumVisibleMessages()
NS_IMETHODIMP nsDBFolderInfo::GetNumVisibleMessages(PRInt32 *result)
{
return m_numVisibleMessages;
}
PRInt32 nsDBFolderInfo::GetFlags()
NS_IMETHODIMP nsDBFolderInfo::GetFlags(PRInt32 *result)
{
return m_flags;
*result = m_flags;
return NS_OK;
}
void nsDBFolderInfo::SetFlags(PRInt32 flags)
NS_IMETHODIMP nsDBFolderInfo::SetFlags(PRInt32 flags)
{
nsresult ret = NS_OK;
if (m_flags != flags)
{
m_flags = flags;
SetInt32PropertyWithToken(m_flagsColumnToken, m_flags);
ret = SetInt32PropertyWithToken(m_flagsColumnToken, m_flags);
}
return ret;
}
void nsDBFolderInfo::OrFlags(PRInt32 flags)
NS_IMETHODIMP nsDBFolderInfo::OrFlags(PRInt32 flags, PRInt32 *result)
{
m_flags |= flags;
SetInt32PropertyWithToken(m_flagsColumnToken, m_flags);
*result = m_flags;
return SetInt32PropertyWithToken(m_flagsColumnToken, m_flags);
}
void nsDBFolderInfo::AndFlags(PRInt32 flags)
NS_IMETHODIMP nsDBFolderInfo::AndFlags(PRInt32 flags, PRInt32 *result)
{
m_flags &= flags;
SetInt32PropertyWithToken(m_flagsColumnToken, m_flags);
*result = m_flags;
return SetInt32PropertyWithToken(m_flagsColumnToken, m_flags);
}
NS_IMETHODIMP nsDBFolderInfo::GetImapUidValidity(PRInt32 *result)
{
*result = m_ImapUidValidity;
return NS_OK;
}
NS_IMETHODIMP nsDBFolderInfo::SetImapUidValidity(PRInt32 uidValidity)
{
m_ImapUidValidity = uidValidity;
return SetUint32PropertyWithToken(m_imapUidValidityColumnToken, m_ImapUidValidity);
}
NS_IMETHODIMP nsDBFolderInfo::GetLastMessageLoaded(nsMsgKey *lastLoaded)
{
*lastLoaded = m_lastMessageLoaded;
return NS_OK;
}
NS_IMETHODIMP nsDBFolderInfo::SetLastMessageLoaded(nsMsgKey lastLoaded)
{
m_lastMessageLoaded = lastLoaded;
return SetUint32PropertyWithToken(m_lastMessageLoadedColumnToken, m_lastMessageLoaded);
}
PRBool nsDBFolderInfo::TestFlag(PRInt32 flags)
@ -432,28 +477,6 @@ void nsDBFolderInfo::ChangeImapUnreadPendingMessages(PRInt32 delta)
}
PRInt32 nsDBFolderInfo::GetImapUidValidity()
{
return m_ImapUidValidity;
}
void nsDBFolderInfo::SetImapUidValidity(PRInt32 uidValidity)
{
m_ImapUidValidity = uidValidity;
SetUint32PropertyWithToken(m_imapUidValidityColumnToken, m_ImapUidValidity);
}
nsMsgKey nsDBFolderInfo::GetLastMessageLoaded()
{
return m_lastMessageLoaded;
}
void nsDBFolderInfo::SetLastMessageLoaded(nsMsgKey lastLoaded)
{
m_lastMessageLoaded = lastLoaded;
SetUint32PropertyWithToken(m_lastMessageLoadedColumnToken, m_lastMessageLoaded);
}
void nsDBFolderInfo::SetKnownArtsSet(nsString &newsArtSet)
{
SetProperty(kKnownArtsSetColumnName, newsArtSet);
@ -466,7 +489,7 @@ void nsDBFolderInfo::GetKnownArtsSet(nsString &newsArtSet)
// get arbitrary property, aka row cell value.
nsresult nsDBFolderInfo::GetProperty(const char *propertyName, nsString &resultProperty)
NS_IMETHODIMP nsDBFolderInfo::GetProperty(const char *propertyName, nsString &resultProperty)
{
nsresult err = NS_OK;
mdb_token property_token;
@ -478,14 +501,14 @@ nsresult nsDBFolderInfo::GetProperty(const char *propertyName, nsString &resultP
return err;
}
nsresult nsDBFolderInfo::SetUint32Property(const char *propertyName, PRUint32 propertyValue)
NS_IMETHODIMP nsDBFolderInfo::SetUint32Property(const char *propertyName, PRUint32 propertyValue)
{
nsString propertyStr;
propertyStr.Append(propertyValue, 10);
return SetProperty(propertyName, propertyStr);
}
nsresult nsDBFolderInfo::SetProperty(const char *propertyName, nsString &propertyStr)
NS_IMETHODIMP nsDBFolderInfo::SetProperty(const char *propertyName, nsString &propertyStr)
{
nsresult err = NS_OK;
mdb_token property_token;
@ -536,7 +559,7 @@ nsresult nsDBFolderInfo::GetInt32PropertyWithToken(mdb_token aProperty, PRInt32
return m_mdb->RowCellColumnToUInt32(m_mdbRow, aProperty, (PRUint32 &) propertyValue);
}
nsresult nsDBFolderInfo::GetUint32Property(const char *propertyName, PRUint32 &propertyValue)
NS_IMETHODIMP nsDBFolderInfo::GetUint32Property(const char *propertyName, PRUint32 &propertyValue)
{
nsresult err = NS_OK;
mdb_token property_token;

View File

@ -92,8 +92,12 @@ nsMailDatabase::~nsMailDatabase()
// can pull out the transfer info for the new db.
if (!newFile && !statResult && !upgrading)
{
PRInt32 numNewMessages;
folderInfo->GetNumNewMessages(&numNewMessages);
if (folderInfo->m_folderSize != st.st_size ||
folderInfo->m_folderDate != st.st_mtime || folderInfo->GetNumNewMessages() < 0)
folderInfo->m_folderDate != st.st_mtime || numNewMessages < 0)
err = NS_MSG_ERROR_FOLDER_SUMMARY_OUT_OF_DATE;
}
// compare current version of db versus filed out version info.

View File

@ -956,7 +956,11 @@ nsresult nsMsgDatabase::MarkAllRead(nsMsgKeyArray *thoseMarked)
if (numChanged > 0) // commit every once in a while
Commit(kSmallCommit);
// force num new to 0.
m_dbFolderInfo->ChangeNumNewMessages(-m_dbFolderInfo->GetNumNewMessages());
PRInt32 numNewMessages;
dbErr = m_dbFolderInfo->GetNumNewMessages(&numNewMessages);
if (dbErr == NS_OK)
m_dbFolderInfo->ChangeNumNewMessages(-numNewMessages);
return dbErr;
}