зеркало из https://github.com/mozilla/gecko-dev.git
start hooking up header deletion
This commit is contained in:
Родитель
2829373a91
Коммит
3c857c171b
|
@ -93,9 +93,14 @@ public:
|
|||
|
||||
MessageKey GetLastMessageLoaded();
|
||||
void SetLastMessageLoaded(MessageKey lastLoaded);
|
||||
|
||||
void SetFolderSize(PRUint32 size);
|
||||
void SetFolderDate(time_t date);
|
||||
|
||||
// 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);
|
||||
|
||||
PRUint16 m_version; // for upgrading...
|
||||
PRInt32 m_sortType; // the last sort type open on this db.
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
// This is the subclass of nsMsgDatabase that handles local mail messages.
|
||||
class nsOfflineImapOperation;
|
||||
class nsMsgKeyArray;
|
||||
class ChangeListener;
|
||||
class MSG_Master;
|
||||
class MSG_FolderInfo;
|
||||
|
||||
|
@ -45,7 +44,7 @@ public:
|
|||
|
||||
virtual nsresult OnNewPath (nsFilePath &newPath);
|
||||
|
||||
virtual nsresult DeleteMessages(nsMsgKeyArray &messageKeys, ChangeListener *instigator);
|
||||
virtual nsresult DeleteMessages(nsMsgKeyArray &messageKeys, nsIDBChangeListener *instigator);
|
||||
|
||||
// virtual int GetCurVersion() {return kMailDBVersion;}
|
||||
static nsresult SetFolderInfoValid(nsFilePath &pathname, int num, int numunread);
|
||||
|
|
|
@ -24,11 +24,12 @@
|
|||
#include "nsString.h"
|
||||
#include "nsFileSpec.h"
|
||||
#include "nsIDBChangeListener.h"
|
||||
#include "nsMsgMessageFlags.h"
|
||||
|
||||
class ListContext;
|
||||
class nsDBFolderInfo;
|
||||
class nsMsgKeyArray;
|
||||
class ChangeListener;
|
||||
class nsNewsSet;
|
||||
|
||||
class nsDBChangeAnnouncer : public XPPtrArray // array of ChangeListeners
|
||||
{
|
||||
|
@ -112,7 +113,10 @@ public:
|
|||
|
||||
// helpers for user command functions like delete, mark read, etc.
|
||||
|
||||
virtual nsresult DeleteMessages(nsMsgKeyArray &messageKeys, ChangeListener *instigator);
|
||||
virtual nsresult DeleteMessages(nsMsgKeyArray &messageKeys, nsIDBChangeListener *instigator);
|
||||
virtual nsresult DeleteHeader(nsMsgHdr *msgHdr, nsIDBChangeListener *instigator, PRBool commit, PRBool notify = TRUE);
|
||||
virtual nsresult RemoveHeaderFromDB(nsMsgHdr *msgHdr);
|
||||
virtual nsresult IsRead(MessageKey messageKey, PRBool *pRead);
|
||||
|
||||
// used mainly to force the timestamp of a local mail folder db to
|
||||
// match the time stamp of the corresponding berkeley mail folder,
|
||||
|
@ -148,6 +152,8 @@ protected:
|
|||
mdbTable *m_mdbAllMsgHeadersTable;
|
||||
nsFilePath m_dbName;
|
||||
|
||||
nsNewsSet *m_newSet; // new messages since last open.
|
||||
|
||||
nsrefcnt mRefCnt;
|
||||
|
||||
static void AddToCache(nsMsgDatabase* pMessageDB)
|
||||
|
@ -155,6 +161,15 @@ protected:
|
|||
static void RemoveFromCache(nsMsgDatabase* pMessageDB);
|
||||
static int FindInCache(nsMsgDatabase* pMessageDB);
|
||||
PRBool MatchDbName(nsFilePath &dbName); // returns TRUE if they match
|
||||
|
||||
virtual nsresult SetKeyFlag(MessageKey messageKey, PRBool set, PRInt32 flag,
|
||||
nsIDBChangeListener *instigator = NULL);
|
||||
virtual void SetHdrFlag(nsMsgHdr *, PRBool bSet, MsgFlags flag);
|
||||
virtual void MarkHdrReadInDB(nsMsgHdr *msgHdr, PRBool bRead,
|
||||
nsIDBChangeListener *instigator);
|
||||
|
||||
virtual nsresult IsHeaderRead(nsMsgHdr *hdr, PRBool *pRead);
|
||||
|
||||
static nsMsgDatabaseArray* GetDBCache();
|
||||
static nsMsgDatabaseArray *m_dbCache;
|
||||
|
||||
|
|
|
@ -47,6 +47,8 @@ public:
|
|||
MessageKey GetMessageKey();
|
||||
MessageKey GetThreadId();
|
||||
void SetMessageKey(MessageKey inKey) {m_messageKey = inKey;}
|
||||
virtual PRUint32 GetMessageSize() {return m_messageSize;}
|
||||
virtual PRUint32 GetFlags() {return m_flags;}
|
||||
|
||||
// this is almost always the m_messageKey, except for the first message.
|
||||
// NeoAccess doesn't allow fID's of 0.
|
||||
|
|
|
@ -189,6 +189,17 @@ void nsDBFolderInfo::SetHighWater(MessageKey highWater, PRBool force /* = FALSE
|
|||
}
|
||||
}
|
||||
|
||||
void nsDBFolderInfo::SetFolderSize(PRUint32 size)
|
||||
{
|
||||
m_folderSize = size;
|
||||
}
|
||||
|
||||
void nsDBFolderInfo::SetFolderDate(time_t folderDate)
|
||||
{
|
||||
m_folderDate = folderDate;
|
||||
}
|
||||
|
||||
|
||||
MessageKey nsDBFolderInfo::GetHighWater()
|
||||
{
|
||||
return m_highWaterMessageKey;
|
||||
|
@ -406,6 +417,13 @@ nsresult nsDBFolderInfo::GetProperty(const char *propertyName, nsString &resultP
|
|||
return err;
|
||||
}
|
||||
|
||||
nsresult 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)
|
||||
{
|
||||
nsresult err = NS_OK;
|
||||
|
|
|
@ -138,7 +138,7 @@ nsresult nsMailDatabase::OnNewPath (nsFilePath &newPath)
|
|||
return ret;
|
||||
}
|
||||
|
||||
nsresult nsMailDatabase::DeleteMessages(nsMsgKeyArray &messageKeys, ChangeListener *instigator)
|
||||
nsresult nsMailDatabase::DeleteMessages(nsMsgKeyArray &messageKeys, nsIDBChangeListener *instigator)
|
||||
{
|
||||
nsresult ret = NS_OK;
|
||||
m_folderFile = PR_Open(m_dbName, PR_RDWR, 0);
|
||||
|
@ -151,9 +151,23 @@ nsresult nsMailDatabase::DeleteMessages(nsMsgKeyArray &messageKeys, ChangeListen
|
|||
}
|
||||
|
||||
|
||||
/* static */ nsresult nsMailDatabase::SetFolderInfoValid(nsFilePath &pathname, int num, int numunread)
|
||||
/* static */ nsresult nsMailDatabase::SetSummaryValid(PRBool valid)
|
||||
{
|
||||
nsresult ret = NS_OK;
|
||||
struct stat st;
|
||||
|
||||
if (stat(m_dbName, &st))
|
||||
return NS_MSG_ERROR_FOLDER_MISSING;
|
||||
|
||||
if (valid)
|
||||
{
|
||||
m_dbFolderInfo->SetFolderSize(st.st_size);
|
||||
m_dbFolderInfo->SetFolderDate(st.st_mtime);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_dbFolderInfo->SetFolderDate(0); // that ought to do the trick.
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -215,11 +229,6 @@ nsresult SetSourceMailbox(nsOfflineImapOperation *op, const char *mailbox, Messa
|
|||
return ret;
|
||||
}
|
||||
|
||||
nsresult nsMailDatabase::SetSummaryValid(PRBool valid /* = TRUE */)
|
||||
{
|
||||
nsresult ret = NS_OK;
|
||||
return ret;
|
||||
}
|
||||
|
||||
nsresult nsMailDatabase::GetIdsWithNoBodies (nsMsgKeyArray &bodylessIds)
|
||||
{
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
#include "nsMsgDatabase.h"
|
||||
#include "nsDBFolderInfo.h"
|
||||
#include "nsNewsSet.h"
|
||||
|
||||
#ifdef WE_HAVE_MDBINTERFACES
|
||||
static NS_DEFINE_IID(kIMDBIID, NS_IMDB_IID);
|
||||
|
@ -397,6 +398,93 @@ nsresult nsMsgDatabase::GetMsgHdrForKey(MessageKey messageKey, nsMsgHdr **pmsgHd
|
|||
return err;
|
||||
}
|
||||
|
||||
nsresult nsMsgDatabase::DeleteMessages(nsMsgKeyArray &messageKeys, nsIDBChangeListener *instigator)
|
||||
{
|
||||
nsresult err = NS_OK;
|
||||
|
||||
for (PRUint32 index = 0; index < messageKeys.GetSize(); index++)
|
||||
{
|
||||
MessageKey messageKey = messageKeys.GetAt(index);
|
||||
nsMsgHdr *msgHdr = NULL;
|
||||
|
||||
err = GetMsgHdrForKey(messageKey, &msgHdr);
|
||||
if (msgHdr == NULL || err != NS_OK)
|
||||
{
|
||||
err = NS_MSG_MESSAGE_NOT_FOUND;
|
||||
break;
|
||||
}
|
||||
err = DeleteHeader(msgHdr, instigator, index % 300 == 0);
|
||||
if (err != NS_OK)
|
||||
break;
|
||||
}
|
||||
// Commit();
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
nsresult nsMsgDatabase::DeleteHeader(nsMsgHdr *msgHdr, nsIDBChangeListener *instigator, PRBool commit, PRBool notify /* = TRUE */)
|
||||
{
|
||||
MessageKey messageKey = msgHdr->GetMessageKey();
|
||||
// only need to do this for mail - will this speed up news expiration? Is dirtying objects
|
||||
// we're about to delete slow for neoaccess? But are we short circuiting some
|
||||
// notifications that we need?
|
||||
// if (GetMailDB())
|
||||
SetHdrFlag(msgHdr, TRUE, MSG_FLAG_EXPUNGED); // tell mailbox (mail)
|
||||
|
||||
if (m_newSet) // if it's in the new set, better get rid of it.
|
||||
m_newSet->Remove(msgHdr->GetMessageKey());
|
||||
|
||||
if (m_dbFolderInfo != NULL)
|
||||
{
|
||||
PRBool isRead;
|
||||
m_dbFolderInfo->ChangeNumMessages(-1);
|
||||
m_dbFolderInfo->ChangeNumVisibleMessages(-1);
|
||||
IsRead(msgHdr->GetMessageKey(), &isRead);
|
||||
if (!isRead)
|
||||
m_dbFolderInfo->ChangeNumNewMessages(-1);
|
||||
|
||||
m_dbFolderInfo->m_expungedBytes += msgHdr->GetMessageSize();
|
||||
|
||||
}
|
||||
|
||||
if (notify)
|
||||
NotifyKeyChangeAll(messageKey, msgHdr->GetFlags(), instigator); // tell listeners
|
||||
|
||||
// if (!onlyRemoveFromThread) // to speed up expiration, try this. But really need to do this in RemoveHeaderFromDB
|
||||
RemoveHeaderFromDB(msgHdr);
|
||||
// if (commit)
|
||||
// Commit(); // ### dmb is this a good time to commit?
|
||||
msgHdr->Release(); // even though we're deleting it from the db, need to unrefer.
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// This is a lower level routine which doesn't send notifcations or
|
||||
// update folder info. One use is when a rule fires moving a header
|
||||
// from one db to another, to remove it from the first db.
|
||||
|
||||
nsresult nsMsgDatabase::RemoveHeaderFromDB(nsMsgHdr *msgHdr)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult nsMsgDatabase::IsRead(MessageKey messageKey, PRBool *pRead)
|
||||
{
|
||||
nsresult err = NS_OK;
|
||||
nsMsgHdr *msgHdr;
|
||||
|
||||
err = GetMsgHdrForKey(messageKey, &msgHdr);
|
||||
if (err == NS_OK && msgHdr != NULL)
|
||||
{
|
||||
err = IsHeaderRead(msgHdr, pRead);
|
||||
msgHdr->Release();
|
||||
return err;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NS_MSG_MESSAGE_NOT_FOUND;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// header iteration methods.
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче