From 290a132e152d63cd8bf56023a86de4ccf6bbd1e9 Mon Sep 17 00:00:00 2001 From: "bienvenu%netscape.com" Date: Wed, 18 Aug 1999 04:05:57 +0000 Subject: [PATCH] fix i18n sorting of sender git-svn-id: svn://10.0.0.236/trunk@43461 18797224-902f-48f8-a5cc-f745e15eee43 --- .../mailnews/db/msgdb/public/nsDBFolderInfo.h | 3 ++ .../db/msgdb/public/nsIDBFolderInfo.idl | 3 ++ .../mailnews/db/msgdb/src/nsDBFolderInfo.cpp | 25 +++++++++++++++-- .../mailnews/db/msgdb/src/nsMsgDatabase.cpp | 3 ++ mozilla/mailnews/db/msgdb/src/nsMsgHdr.cpp | 28 +++++++++++++++++-- 5 files changed, 57 insertions(+), 5 deletions(-) diff --git a/mozilla/mailnews/db/msgdb/public/nsDBFolderInfo.h b/mozilla/mailnews/db/msgdb/public/nsDBFolderInfo.h index 738218c77ca..0096d1dbe40 100644 --- a/mozilla/mailnews/db/msgdb/public/nsDBFolderInfo.h +++ b/mozilla/mailnews/db/msgdb/public/nsDBFolderInfo.h @@ -73,6 +73,8 @@ public: NS_IMETHOD SetImapUnreadPendingMessages(PRInt32 unreadPending) ; NS_IMETHOD GetCharacterSet(nsString *result) ; NS_IMETHOD SetCharacterSet(nsString *charSet) ; + NS_IMETHOD GetCharPtrCharacterSet(char **result); + NS_IMETHOD GetLocale(nsString *result) ; NS_IMETHOD SetLocale(nsString *locale) ; @@ -94,6 +96,7 @@ public: NS_IMETHOD GetProperty(const char *propertyName, nsString *resultProperty); NS_IMETHOD SetProperty(const char *propertyName, nsString *propertyStr); + NS_IMETHOD GetCharPtrProperty(const char *propertyName, char **resultProperty); NS_IMETHOD SetUint32Property(const char *propertyName, PRUint32 propertyValue); NS_IMETHOD GetUint32Property(const char *propertyName, PRUint32 *propertyValue); diff --git a/mozilla/mailnews/db/msgdb/public/nsIDBFolderInfo.idl b/mozilla/mailnews/db/msgdb/public/nsIDBFolderInfo.idl index 6470e5d21ee..da3c20184d6 100644 --- a/mozilla/mailnews/db/msgdb/public/nsIDBFolderInfo.idl +++ b/mozilla/mailnews/db/msgdb/public/nsIDBFolderInfo.idl @@ -53,6 +53,9 @@ interface nsIDBFolderInfo : nsISupports { [noscript] void GetCharacterSet(in nsString result); [noscript] void SetCharacterSet(in nsString result); + + void GetCharPtrCharacterSet(out string result); + [noscript] void GetLocale(in nsString result); [noscript] void SetLocale(in nsString locale); diff --git a/mozilla/mailnews/db/msgdb/src/nsDBFolderInfo.cpp b/mozilla/mailnews/db/msgdb/src/nsDBFolderInfo.cpp index 4bb3f731973..34b48cc65ed 100644 --- a/mozilla/mailnews/db/msgdb/src/nsDBFolderInfo.cpp +++ b/mozilla/mailnews/db/msgdb/src/nsDBFolderInfo.cpp @@ -533,8 +533,13 @@ PRBool nsDBFolderInfo::TestFlag(PRInt32 flags) NS_IMETHODIMP nsDBFolderInfo::GetCharacterSet(nsString *result) { - GetProperty(kCharacterSetColumnName, result); - return NS_OK; + return GetProperty(kCharacterSetColumnName, result); +} + +NS_IMETHODIMP +nsDBFolderInfo::GetCharPtrCharacterSet(char **result) +{ + return GetCharPtrProperty(kCharacterSetColumnName, result); } NS_IMETHODIMP nsDBFolderInfo::SetCharacterSet(nsString *charSet) @@ -636,6 +641,22 @@ NS_IMETHODIMP nsDBFolderInfo::GetProperty(const char *propertyName, nsString *re return err; } +// Caller must PR_FREEIF resultProperty. +NS_IMETHODIMP nsDBFolderInfo::GetCharPtrProperty(const char *propertyName, char **resultProperty) +{ + nsresult err = NS_OK; + mdb_token property_token; + + if (!resultProperty) + return NS_ERROR_NULL_POINTER; + err = m_mdb->GetStore()->StringToToken(m_mdb->GetEnv(), propertyName, &property_token); + if (err == NS_OK) + err = m_mdb->RowCellColumnToCharPtr(m_mdbRow, property_token, resultProperty); + + return err; +} + + NS_IMETHODIMP nsDBFolderInfo::SetUint32Property(const char *propertyName, PRUint32 propertyValue) { struct mdbYarn yarn; diff --git a/mozilla/mailnews/db/msgdb/src/nsMsgDatabase.cpp b/mozilla/mailnews/db/msgdb/src/nsMsgDatabase.cpp index 4bf754215cc..56cb1eb26f8 100644 --- a/mozilla/mailnews/db/msgdb/src/nsMsgDatabase.cpp +++ b/mozilla/mailnews/db/msgdb/src/nsMsgDatabase.cpp @@ -2195,6 +2195,7 @@ nsresult nsMsgDatabase::CharPtrToRowCellColumn(nsIMdbRow *row, mdb_token columnT return row->AddColumn(GetEnv(), columnToken, &yarn); } +// caller must PR_FREEIF result nsresult nsMsgDatabase::RowCellColumnToCharPtr(nsIMdbRow *row, mdb_token columnToken, char **result) { nsresult err = NS_ERROR_NULL_POINTER; @@ -2215,6 +2216,8 @@ nsresult nsMsgDatabase::RowCellColumnToCharPtr(nsIMdbRow *row, mdb_token columnT hdrCell->CutStrongRef(GetEnv()); // always release ref } + else if (err == NS_OK) // guarantee a non-null result + *result = nsCRT::strdup(""); } return err; } diff --git a/mozilla/mailnews/db/msgdb/src/nsMsgHdr.cpp b/mozilla/mailnews/db/msgdb/src/nsMsgHdr.cpp index 8ddbffa63cb..41a0e066fc5 100644 --- a/mozilla/mailnews/db/msgdb/src/nsMsgHdr.cpp +++ b/mozilla/mailnews/db/msgdb/src/nsMsgHdr.cpp @@ -21,9 +21,12 @@ #include "nsMsgDatabase.h" #include "nsMsgUtils.h" #include "nsIMsgHeaderParser.h" +#include "nsIMimeConverter.h" NS_IMPL_ISUPPORTS(nsMsgHdr, nsIMsgDBHdr::GetIID()) +static NS_DEFINE_CID(kCMimeConverterCID, NS_MIME_CONVERTER_CID); + nsMsgHdr::nsMsgHdr(nsMsgDatabase *db, nsIMdbRow *dbRow) { NS_INIT_REFCNT(); @@ -507,9 +510,28 @@ NS_IMETHODIMP nsMsgHdr::GetAuthorCollationKey(nsString *resultAuthor) 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; + // apply mime decode + nsIMimeConverter *converter; + ret = nsComponentManager::CreateInstance(kCMimeConverterCID, nsnull, + nsIMimeConverter::GetIID(), (void **)&converter); + + if (NS_SUCCEEDED(ret) && nsnull != converter) + { + char *resultStr = nsnull; + char *charset = nsnull; + m_mdb->m_dbFolderInfo->GetCharPtrCharacterSet(&charset); + char charsetName[128]; + PL_strncpy(charsetName, charset, sizeof(charsetName)); + + ret = converter->DecodeMimePartIIStr(cSender.GetBuffer(), charsetName, &resultStr); + if (NS_SUCCEEDED(ret)) + { + ret = headerParser->ExtractHeaderAddressName (charsetName, resultStr, &name); + } + NS_RELEASE(converter); + PR_FREEIF(resultStr); + PR_FREEIF(charset); + } } }