From 98bc6024280459300b01f0391bfeec8d2688f30c Mon Sep 17 00:00:00 2001 From: "bienvenu%netscape.com" Date: Mon, 9 Aug 1999 19:52:46 +0000 Subject: [PATCH] sort by sender correctly, fix ptr/ref idl stuff in nsIMsgDatabase --- mailnews/db/msgdb/public/nsIMsgDatabase.idl | 19 +++++++-------- mailnews/db/msgdb/public/nsMsgDatabase.h | 4 +++ mailnews/db/msgdb/src/nsMsgDatabase.cpp | 17 +++++++------ mailnews/db/msgdb/src/nsMsgHdr.cpp | 27 ++++++++++++++++++++- 4 files changed, 49 insertions(+), 18 deletions(-) diff --git a/mailnews/db/msgdb/public/nsIMsgDatabase.idl b/mailnews/db/msgdb/public/nsIMsgDatabase.idl index 7e98402672cc..a08ade7c2f90 100644 --- a/mailnews/db/msgdb/public/nsIMsgDatabase.idl +++ b/mailnews/db/msgdb/public/nsIMsgDatabase.idl @@ -44,7 +44,8 @@ interface nsMsgDBCommitType }; -[ref] native nsMsgKeyArray(nsMsgKeyArray); +[ref] native nsMsgKeyArrayRef(nsMsgKeyArray); +[ptr] native nsMsgKeyArrayPtr(nsMsgKeyArray); [scriptable, uuid(9188bc83-f92e-11d2-81ef-0060083a0bcf)] @@ -74,7 +75,7 @@ interface nsIMsgDatabase : nsIDBChangeAnnouncer { nsIMsgDBHdr CopyHdrFromExistingHdr(in nsMsgKey key, in nsIMsgDBHdr existingHdr); - void ListAllKeys(in nsMsgKeyArray outputKeys); + void ListAllKeys(in nsMsgKeyArrayRef outputKeys); nsIEnumerator EnumerateMessages(); nsIEnumerator EnumerateThreads(); @@ -122,13 +123,11 @@ interface nsIMsgDatabase : nsIDBChangeAnnouncer { boolean IsMarked(in nsMsgKey key); boolean HasAttachments(in nsMsgKey key); -[ptr] native nsMsgKeyArray(nsMsgKeyArray); + void MarkAllRead(in nsMsgKeyArrayPtr thoseMarked); - void MarkAllRead(in nsMsgKeyArray thoseMarked); + void MarkReadByDate (in PRTime startDate, in PRTime endDate, in nsMsgKeyArrayPtr markedIds); - void MarkReadByDate (in PRTime startDate, in PRTime endDate, in nsMsgKeyArray markedIds); - - void DeleteMessages(in nsMsgKeyArray nsMsgKeys, in nsIDBChangeListener instigator); + void DeleteMessages(in nsMsgKeyArrayPtr nsMsgKeys, in nsIDBChangeListener instigator); void DeleteMessage(in nsMsgKey key, in nsIDBChangeListener instigator, in boolean commit); @@ -144,7 +143,7 @@ interface nsIMsgDatabase : nsIDBChangeAnnouncer { in nsIDBChangeListener instigator); // returns NS_OK on success, NS_COMFALSE on failure - void AllMsgKeysImapDeleted(in nsMsgKeyArray keys); + void AllMsgKeysImapDeleted(in nsMsgKeyArrayPtr keys); void MarkImapDeleted(in nsMsgKey key, in boolean deleted, in nsIDBChangeListener instigator); @@ -160,8 +159,8 @@ interface nsIMsgDatabase : nsIDBChangeAnnouncer { void SetSummaryValid(in boolean valid); // offline operations - void ListAllOfflineOpIds(in nsMsgKeyArray offlineOpIds); - void ListAllOfflineDeletes(in nsMsgKeyArray offlineDeletes); + void ListAllOfflineOpIds(in nsMsgKeyArrayPtr offlineOpIds); + void ListAllOfflineDeletes(in nsMsgKeyArrayPtr offlineDeletes); readonly attribute nsMsgKey LowWaterArticleNum; readonly attribute nsMsgKey HighWaterArticleNum; diff --git a/mailnews/db/msgdb/public/nsMsgDatabase.h b/mailnews/db/msgdb/public/nsMsgDatabase.h index 705c2351d8ca..900738a9825d 100644 --- a/mailnews/db/msgdb/public/nsMsgDatabase.h +++ b/mailnews/db/msgdb/public/nsMsgDatabase.h @@ -214,12 +214,16 @@ public: 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); + + nsresult CreateCollationKey(nsString &sourceString, nsString &resultString); + // 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); diff --git a/mailnews/db/msgdb/src/nsMsgDatabase.cpp b/mailnews/db/msgdb/src/nsMsgDatabase.cpp index 451aac0b8895..f6439ea5cd30 100644 --- a/mailnews/db/msgdb/src/nsMsgDatabase.cpp +++ b/mailnews/db/msgdb/src/nsMsgDatabase.cpp @@ -2102,13 +2102,16 @@ nsresult nsMsgDatabase::RowCellColumnToCollationKey(nsIMdbRow *row, mdb_token co err = RowCellColumnToMime2DecodedString(row, columnToken, nakedString); if (NS_SUCCEEDED(err)) - { - err = GetCollationKeyGenerator(); - if (NS_SUCCEEDED(err) && m_collationKeyGenerator) - { - err = m_collationKeyGenerator->CreateSortKey( kCollationCaseInSensitive, nakedString, resultStr) ; - } - } + err = CreateCollationKey(nakedString, resultStr); + + return err; +} + +nsresult nsMsgDatabase::CreateCollationKey(nsString &sourceString, nsString &resultString) +{ + nsresult err = GetCollationKeyGenerator(); + if (NS_SUCCEEDED(err) && m_collationKeyGenerator) + err = m_collationKeyGenerator->CreateSortKey( kCollationCaseInSensitive, sourceString, resultString) ; return err; } diff --git a/mailnews/db/msgdb/src/nsMsgHdr.cpp b/mailnews/db/msgdb/src/nsMsgHdr.cpp index 8921ca26d798..8ddbffa63cb0 100644 --- a/mailnews/db/msgdb/src/nsMsgHdr.cpp +++ b/mailnews/db/msgdb/src/nsMsgHdr.cpp @@ -20,6 +20,7 @@ #include "nsMsgHdr.h" #include "nsMsgDatabase.h" #include "nsMsgUtils.h" +#include "nsIMsgHeaderParser.h" NS_IMPL_ISUPPORTS(nsMsgHdr, nsIMsgDBHdr::GetIID()) @@ -497,7 +498,31 @@ NS_IMETHODIMP nsMsgHdr::GetMime2DecodedRecipients(nsString *resultRecipients) NS_IMETHODIMP nsMsgHdr::GetAuthorCollationKey(nsString *resultAuthor) { - return m_mdb->RowCellColumnToCollationKey(GetMDBRow(), m_mdb->m_senderColumnToken, *resultAuthor); + nsCAutoString cSender; + char *name = nsnull; + + nsresult ret = m_mdb->RowCellColumnTonsCString(GetMDBRow(), m_mdb->m_senderColumnToken, cSender); + if (NS_SUCCEEDED(ret)) + { + nsIMsgHeaderParser *headerParser = m_mdb->GetHeaderParser(); + if (headerParser) + { + //XXXOnce we get the csid, use Intl version + if(NS_SUCCEEDED(ret = headerParser->ExtractHeaderAddressName (nsnull, cSender, &name))) + *resultAuthor = name; + + } + } + if (NS_SUCCEEDED(ret)) + { + nsAutoString autoString(name); + ret = m_mdb->CreateCollationKey(autoString, *resultAuthor); + } + + if(name) + PL_strfree(name); + + return ret; } NS_IMETHODIMP nsMsgHdr::GetSubjectCollationKey(nsString *resultSubject)