mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-25 00:27:29 +09:00
parent
c45692398e
commit
c173b90220
3 changed files with 53 additions and 41 deletions
|
|
@ -20,27 +20,18 @@ class nsIMsgThread;
|
||||||
class nsMsgHdr : public nsIMsgDBHdr {
|
class nsMsgHdr : public nsIMsgDBHdr {
|
||||||
public:
|
public:
|
||||||
NS_DECL_NSIMSGDBHDR
|
NS_DECL_NSIMSGDBHDR
|
||||||
friend class nsMsgDatabase;
|
friend class nsMsgDatabase;
|
||||||
friend class nsMsgPropertyEnumerator; // accesses m_mdb
|
friend class nsImapMailDatabase;
|
||||||
|
friend class nsMsgPropertyEnumerator;
|
||||||
|
friend class nsMsgThread;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
// nsMsgHdr methods:
|
// nsMsgHdr methods:
|
||||||
nsMsgHdr(nsMsgDatabase *db, nsIMdbRow *dbRow);
|
nsMsgHdr(nsMsgDatabase *db, nsIMdbRow *dbRow);
|
||||||
|
|
||||||
virtual nsresult GetRawFlags(uint32_t *result);
|
|
||||||
void Init();
|
|
||||||
virtual nsresult InitCachedValues();
|
|
||||||
virtual nsresult InitFlags();
|
|
||||||
void ClearCachedValues() {m_initedValues = 0;}
|
|
||||||
|
|
||||||
NS_DECL_ISUPPORTS
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
nsIMdbRow *GetMDBRow() {return m_mdbRow;}
|
|
||||||
bool IsParentOf(nsIMsgDBHdr *possibleChild);
|
|
||||||
bool IsAncestorOf(nsIMsgDBHdr *possibleChild);
|
|
||||||
bool IsAncestorKilled(uint32_t ancestorsToCheck);
|
|
||||||
void ReparentInThread(nsIMsgThread *thread);
|
|
||||||
|
|
||||||
size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOfFun) const
|
size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOfFun) const
|
||||||
{
|
{
|
||||||
return m_references.ShallowSizeOfExcludingThis(aMallocSizeOfFun);
|
return m_references.ShallowSizeOfExcludingThis(aMallocSizeOfFun);
|
||||||
|
|
@ -51,7 +42,26 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ~nsMsgHdr();
|
nsIMdbRow* GetMDBRow() { return m_mdbRow; }
|
||||||
|
void ReleaseMDBRow() { NS_IF_RELEASE(m_mdbRow); }
|
||||||
|
nsMsgDatabase* GetMdb() { return m_mdb; }
|
||||||
|
void ClearCachedValues() { m_initedValues = 0; }
|
||||||
|
|
||||||
|
virtual nsresult GetRawFlags(uint32_t *result);
|
||||||
|
|
||||||
|
bool IsParentOf(nsIMsgDBHdr *possibleChild);
|
||||||
|
bool IsAncestorOf(nsIMsgDBHdr *possibleChild);
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual ~nsMsgHdr();
|
||||||
|
|
||||||
|
void Init();
|
||||||
|
virtual nsresult InitFlags();
|
||||||
|
virtual nsresult InitCachedValues();
|
||||||
|
|
||||||
|
bool IsAncestorKilled(uint32_t ancestorsToCheck);
|
||||||
|
void ReparentInThread(nsIMsgThread *thread);
|
||||||
|
|
||||||
nsresult SetStringColumn(const char *str, mdb_token token);
|
nsresult SetStringColumn(const char *str, mdb_token token);
|
||||||
nsresult SetUInt32Column(uint32_t value, mdb_token token);
|
nsresult SetUInt32Column(uint32_t value, mdb_token token);
|
||||||
nsresult GetUInt32Column(mdb_token token, uint32_t *pvalue, uint32_t defaultValue = 0);
|
nsresult GetUInt32Column(mdb_token token, uint32_t *pvalue, uint32_t defaultValue = 0);
|
||||||
|
|
@ -64,11 +74,11 @@ protected:
|
||||||
bool acceptNonDelimitedReferences);
|
bool acceptNonDelimitedReferences);
|
||||||
|
|
||||||
nsMsgKey m_threadId;
|
nsMsgKey m_threadId;
|
||||||
nsMsgKey m_messageKey; //news: article number, mail mbox offset, imap uid...
|
nsMsgKey m_messageKey; // news: article number, local mail: key, imap: uid...
|
||||||
nsMsgKey m_threadParent; // message this is a reply to, in thread.
|
nsMsgKey m_threadParent; // message this is a reply to, in thread.
|
||||||
PRTime m_date;
|
PRTime m_date;
|
||||||
uint32_t m_messageSize; // lines for news articles, bytes for mail messages
|
uint32_t m_messageSize; // lines for news articles, bytes for mail messages
|
||||||
uint32_t m_statusOffset; // offset in a local mail message of the mozilla status hdr
|
uint32_t m_statusOffset; // offset in a local mail message of the x-mozilla-status header
|
||||||
uint32_t m_flags;
|
uint32_t m_flags;
|
||||||
// avoid parsing references every time we want one
|
// avoid parsing references every time we want one
|
||||||
nsTArray<nsCString> m_references;
|
nsTArray<nsCString> m_references;
|
||||||
|
|
|
||||||
|
|
@ -2029,14 +2029,14 @@ NS_IMETHODIMP nsMsgDatabase::DeleteHeader(nsIMsgDBHdr *msg, nsIDBChangeListener
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsMsgDatabase::UndoDelete(nsIMsgDBHdr *aMsgHdr)
|
nsMsgDatabase::UndoDelete(nsIMsgDBHdr *aMsgHdr)
|
||||||
{
|
{
|
||||||
if (aMsgHdr)
|
if (aMsgHdr)
|
||||||
{
|
{
|
||||||
nsMsgHdr* msgHdr = static_cast<nsMsgHdr*>(aMsgHdr); // closed system, so this is ok
|
// Force deleted flag, so SetHdrFlag won't bail out because deleted flag isn't set.
|
||||||
// force deleted flag, so SetHdrFlag won't bail out because deleted flag isn't set
|
uint32_t result;
|
||||||
msgHdr->m_flags |= nsMsgMessageFlags::Expunged;
|
aMsgHdr->OrFlags(nsMsgMessageFlags::Expunged, &result);
|
||||||
SetHdrFlag(msgHdr, false, nsMsgMessageFlags::Expunged); // clear deleted flag in db
|
SetHdrFlag(aMsgHdr, false, nsMsgMessageFlags::Expunged); // Clear deleted flag in db.
|
||||||
}
|
}
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult nsMsgDatabase::RemoveHeaderFromThread(nsMsgHdr *msgHdr)
|
nsresult nsMsgDatabase::RemoveHeaderFromThread(nsMsgHdr *msgHdr)
|
||||||
|
|
@ -2080,7 +2080,7 @@ nsresult nsMsgDatabase::RemoveHeaderFromDB(nsMsgHdr *msgHdr)
|
||||||
ret = m_mdbAllMsgHeadersTable->CutRow(GetEnv(), row);
|
ret = m_mdbAllMsgHeadersTable->CutRow(GetEnv(), row);
|
||||||
row->CutAllColumns(GetEnv());
|
row->CutAllColumns(GetEnv());
|
||||||
}
|
}
|
||||||
msgHdr->m_initedValues = 0; // invalidate cached values.
|
msgHdr->ClearCachedValues();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3497,8 +3497,10 @@ NS_IMETHODIMP nsMsgDatabase::AddNewHdrToDB(nsIMsgDBHdr *newHdr, bool notify)
|
||||||
NS_ENSURE_ARG_POINTER(newHdr);
|
NS_ENSURE_ARG_POINTER(newHdr);
|
||||||
nsMsgHdr* hdr = static_cast<nsMsgHdr*>(newHdr); // closed system, cast ok
|
nsMsgHdr* hdr = static_cast<nsMsgHdr*>(newHdr); // closed system, cast ok
|
||||||
bool newThread;
|
bool newThread;
|
||||||
bool hasKey;
|
bool hasKey = false;
|
||||||
ContainsKey(hdr->m_messageKey, &hasKey);
|
nsMsgKey msgKey = nsMsgKey_None;
|
||||||
|
(void)hdr->GetMessageKey(&msgKey);
|
||||||
|
(void)ContainsKey(msgKey, &hasKey);
|
||||||
if (hasKey)
|
if (hasKey)
|
||||||
{
|
{
|
||||||
NS_ERROR("adding hdr that already exists");
|
NS_ERROR("adding hdr that already exists");
|
||||||
|
|
@ -3573,7 +3575,7 @@ NS_IMETHODIMP nsMsgDatabase::CopyHdrFromExistingHdr(nsMsgKey key, nsIMsgDBHdr *e
|
||||||
{
|
{
|
||||||
// we may have gotten the header from a cache - calling SetRow
|
// we may have gotten the header from a cache - calling SetRow
|
||||||
// basically invalidates any cached values, so invalidate them.
|
// basically invalidates any cached values, so invalidate them.
|
||||||
destMsgHdr->m_initedValues = 0;
|
destMsgHdr->ClearCachedValues();
|
||||||
if(addHdrToDB)
|
if(addHdrToDB)
|
||||||
err = AddNewHdrToDB(destMsgHdr, true);
|
err = AddNewHdrToDB(destMsgHdr, true);
|
||||||
if (NS_SUCCEEDED(err) && newHdr)
|
if (NS_SUCCEEDED(err) && newHdr)
|
||||||
|
|
@ -4831,7 +4833,8 @@ nsresult nsMsgDatabase::AddNewThread(nsMsgHdr *msgHdr)
|
||||||
nsMsgThread *threadHdr = nullptr;
|
nsMsgThread *threadHdr = nullptr;
|
||||||
|
|
||||||
nsCString subject;
|
nsCString subject;
|
||||||
nsMsgKey threadKey = msgHdr->m_messageKey;
|
nsMsgKey threadKey;
|
||||||
|
msgHdr->GetMessageKey(&threadKey);
|
||||||
// can't have a thread with key 1 since that's the table id of the all msg hdr table,
|
// can't have a thread with key 1 since that's the table id of the all msg hdr table,
|
||||||
// so give it kTableKeyForThreadOne (0xfffffffe).
|
// so give it kTableKeyForThreadOne (0xfffffffe).
|
||||||
if (threadKey == kAllMsgHdrsTableKey)
|
if (threadKey == kAllMsgHdrsTableKey)
|
||||||
|
|
@ -5060,9 +5063,8 @@ nsresult nsMsgDatabase::DumpContents()
|
||||||
keys->GetLength(&numKeys);
|
keys->GetLength(&numKeys);
|
||||||
for (i = 0; i < numKeys; i++) {
|
for (i = 0; i < numKeys; i++) {
|
||||||
key = keys->m_keys[i];
|
key = keys->m_keys[i];
|
||||||
nsIMsgDBHdr *msg = NULL;
|
nsCOMPtr<nsIMsgDBHdr> msgHdr;
|
||||||
rv = GetMsgHdrForKey(key, &msg);
|
rv = GetMsgHdrForKey(key, getter_AddRefs(msgHdr));
|
||||||
nsMsgHdr* msgHdr = static_cast<nsMsgHdr*>(msg); // closed system, cast ok
|
|
||||||
if (NS_SUCCEEDED(rv))
|
if (NS_SUCCEEDED(rv))
|
||||||
{
|
{
|
||||||
nsCString author;
|
nsCString author;
|
||||||
|
|
@ -5072,7 +5074,6 @@ nsresult nsMsgDatabase::DumpContents()
|
||||||
msgHdr->GetAuthor(getter_Copies(author));
|
msgHdr->GetAuthor(getter_Copies(author));
|
||||||
msgHdr->GetSubject(getter_Copies(subject));
|
msgHdr->GetSubject(getter_Copies(subject));
|
||||||
printf("hdr key = %u, author = %s subject = %s\n", key, author.get(), subject.get());
|
printf("hdr key = %u, author = %s subject = %s\n", key, author.get(), subject.get());
|
||||||
NS_RELEASE(msgHdr);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nsTArray<nsMsgKey> threads;
|
nsTArray<nsMsgKey> threads;
|
||||||
|
|
@ -5867,24 +5868,25 @@ nsMsgDatabase::UpdateHdrInCache(const char *aSearchFolderUri, nsIMsgDBHdr *aHdr,
|
||||||
nsresult err = GetSearchResultsTable(aSearchFolderUri, true, getter_AddRefs(table));
|
nsresult err = GetSearchResultsTable(aSearchFolderUri, true, getter_AddRefs(table));
|
||||||
NS_ENSURE_SUCCESS(err, err);
|
NS_ENSURE_SUCCESS(err, err);
|
||||||
nsMsgKey key;
|
nsMsgKey key;
|
||||||
aHdr->GetMessageKey(&key);
|
err = aHdr->GetMessageKey(&key);
|
||||||
nsMsgHdr* msgHdr = static_cast<nsMsgHdr*>(aHdr); // closed system, so this is ok
|
nsMsgHdr* msgHdr = static_cast<nsMsgHdr*>(aHdr); // closed system, so this is ok
|
||||||
if (NS_SUCCEEDED(err) && m_mdbStore && msgHdr->m_mdbRow)
|
nsIMdbRow* hdrRow = msgHdr->GetMDBRow();
|
||||||
|
if (NS_SUCCEEDED(err) && m_mdbStore && hdrRow)
|
||||||
{
|
{
|
||||||
if (!aAdd)
|
if (!aAdd)
|
||||||
{
|
{
|
||||||
table->CutRow(m_mdbEnv, msgHdr->m_mdbRow);
|
table->CutRow(m_mdbEnv, hdrRow);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mdbOid rowId;
|
mdbOid rowId;
|
||||||
msgHdr->m_mdbRow->GetOid(m_mdbEnv, &rowId);
|
hdrRow->GetOid(m_mdbEnv, &rowId);
|
||||||
mdb_pos insertPos = FindInsertIndexInSortedTable(table, rowId.mOid_Id);
|
mdb_pos insertPos = FindInsertIndexInSortedTable(table, rowId.mOid_Id);
|
||||||
uint32_t rowCount;
|
uint32_t rowCount;
|
||||||
table->GetCount(m_mdbEnv, &rowCount);
|
table->GetCount(m_mdbEnv, &rowCount);
|
||||||
table->AddRow(m_mdbEnv, msgHdr->m_mdbRow);
|
table->AddRow(m_mdbEnv, hdrRow);
|
||||||
mdb_pos newPos;
|
mdb_pos newPos;
|
||||||
table->MoveRow(m_mdbEnv, msgHdr->m_mdbRow, rowCount, insertPos, &newPos);
|
table->MoveRow(m_mdbEnv, hdrRow, rowCount, insertPos, &newPos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1023,7 +1023,7 @@ nsMsgPropertyEnumerator::nsMsgPropertyEnumerator(nsMsgHdr* aHdr)
|
||||||
if (aHdr &&
|
if (aHdr &&
|
||||||
(mdbRow = aHdr->GetMDBRow()) &&
|
(mdbRow = aHdr->GetMDBRow()) &&
|
||||||
(m_hdr = aHdr) &&
|
(m_hdr = aHdr) &&
|
||||||
(mdb = aHdr->m_mdb) &&
|
(mdb = aHdr->GetMdb()) &&
|
||||||
(m_mdbEnv = mdb->m_mdbEnv) &&
|
(m_mdbEnv = mdb->m_mdbEnv) &&
|
||||||
(m_mdbStore = mdb->m_mdbStore))
|
(m_mdbStore = mdb->m_mdbStore))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue