From 30f1f5a0f20aa74a7ce9a8fa559d575be4bb1c19 Mon Sep 17 00:00:00 2001 From: "chuang%netscape.com" Date: Thu, 16 Sep 1999 03:49:47 +0000 Subject: [PATCH] Fix Bug 12882 International sort doesn't work for Address Book --- mailnews/addrbook/public/nsIAbCard.idl | 1 + mailnews/addrbook/src/nsAbCardProperty.cpp | 41 +++++++++++ mailnews/addrbook/src/nsAbCardProperty.h | 2 + mailnews/addrbook/src/nsCardDataSource.cpp | 85 ++++++++++++++++------ mailnews/addrbook/src/nsCardDataSource.h | 3 + 5 files changed, 110 insertions(+), 22 deletions(-) diff --git a/mailnews/addrbook/public/nsIAbCard.idl b/mailnews/addrbook/public/nsIAbCard.idl index 3556b24c6b93..823218a80aef 100644 --- a/mailnews/addrbook/public/nsIAbCard.idl +++ b/mailnews/addrbook/public/nsIAbCard.idl @@ -93,4 +93,5 @@ interface nsIAbCard : nsISupports { void AddCardToDatabase(in string uri); void EditCardToDatabase(in string uri); void CopyCard(in nsIAbCard srcCard); + void GetCollationKey(in wstring str, out wstring key); }; diff --git a/mailnews/addrbook/src/nsAbCardProperty.cpp b/mailnews/addrbook/src/nsAbCardProperty.cpp index 3d40e019d697..0b33c06abd88 100644 --- a/mailnews/addrbook/src/nsAbCardProperty.cpp +++ b/mailnews/addrbook/src/nsAbCardProperty.cpp @@ -28,11 +28,20 @@ #include "rdf.h" #include "nsCOMPtr.h" +#include "nsICollation.h" +#include "nsILocale.h" +#include "nsLocaleCID.h" +#include "nsILocaleService.h" +#include "nsCollationCID.h" + #include "nsAddrDatabase.h" #include "nsIAddrBookSession.h" static NS_DEFINE_CID(kAddressBookDBCID, NS_ADDRESSBOOKDB_CID); static NS_DEFINE_CID(kAddrBookSessionCID, NS_ADDRBOOKSESSION_CID); +static NS_DEFINE_CID(kLocaleServiceCID, NS_LOCALESERVICE_CID); +static NS_DEFINE_CID(kCollationFactoryCID, NS_COLLATIONFACTORY_CID); +static NS_DEFINE_IID(kICollationFactoryIID, NS_ICOLLATIONFACTORY_IID); /* The definition is nsAddressBook.cpp */ @@ -801,3 +810,35 @@ NS_IMETHODIMP nsAbCardProperty::CopyCard(nsIAbCard* srcCard) return NS_OK; } +NS_IMETHODIMP nsAbCardProperty::GetCollationKey(const PRUnichar *str, PRUnichar **key) +{ + nsresult rv; + nsAutoString convertStr(str); + nsAutoString resultStr; + + nsCOMPtr locale; + nsCOMPtr collationKeyGenerator; + + NS_WITH_SERVICE(nsILocaleService, localeSvc, kLocaleServiceCID, &rv); + if (NS_FAILED(rv)) return rv; + + rv = localeSvc->GetApplicationLocale(getter_AddRefs(locale)); + if (NS_SUCCEEDED(rv) && locale) + { + nsCOMPtr factory; + + rv = nsComponentManager::CreateInstance(kCollationFactoryCID, NULL, + kICollationFactoryIID, getter_AddRefs(factory)); + if (NS_SUCCEEDED(rv) && factory) + { + rv = factory->CreateCollation(locale, getter_AddRefs(collationKeyGenerator)); + if (NS_SUCCEEDED(rv) && collationKeyGenerator) + { + rv = collationKeyGenerator->CreateSortKey(kCollationCaseInSensitive, convertStr, resultStr); + *key = resultStr.ToNewUnicode(); + } + } + } + + return rv; +} diff --git a/mailnews/addrbook/src/nsAbCardProperty.h b/mailnews/addrbook/src/nsAbCardProperty.h index 8bc8c824f314..6bdab8e8f3c4 100644 --- a/mailnews/addrbook/src/nsAbCardProperty.h +++ b/mailnews/addrbook/src/nsAbCardProperty.h @@ -151,6 +151,8 @@ public: NS_IMETHOD EditCardToDatabase(const char *uri); NS_IMETHOD CopyCard(nsIAbCard* srcCard); + NS_IMETHOD GetCollationKey(const PRUnichar *str, PRUnichar **key); + protected: diff --git a/mailnews/addrbook/src/nsCardDataSource.cpp b/mailnews/addrbook/src/nsCardDataSource.cpp index b187f569c860..247d18c1ae6b 100644 --- a/mailnews/addrbook/src/nsCardDataSource.cpp +++ b/mailnews/addrbook/src/nsCardDataSource.cpp @@ -43,6 +43,10 @@ nsIRDFResource* nsAbCardDataSource::kNC_DisplayName = nsnull; nsIRDFResource* nsAbCardDataSource::kNC_PrimaryEmail = nsnull; nsIRDFResource* nsAbCardDataSource::kNC_WorkPhone = nsnull; +//for locale sorting, +nsIRDFResource* nsAbCardDataSource::kNC_DisplayNameCollation = nsnull; +nsIRDFResource* nsAbCardDataSource::kNC_PrimaryEmailCollation = nsnull; + // commands nsIRDFResource* nsAbCardDataSource::kNC_Delete = nsnull; nsIRDFResource* nsAbCardDataSource::kNC_NewCard = nsnull; @@ -52,6 +56,9 @@ nsIRDFResource* nsAbCardDataSource::kNC_NewCard = nsnull; #define NC_RDF_PRIMARYEMAIL "http://home.netscape.com/NC-rdf#PrimaryEmail" #define NC_RDF_WORKNAME "http://home.netscape.com/NC-rdf#WorkPhone" +#define NC_RDF_DISPLAYNAME_SORT "http://home.netscape.com/NC-rdf#DisplayName?collation=true" +#define NC_RDF_PRIMARYEMAIL_SORT "http://home.netscape.com/NC-rdf#PrimaryEmail?collation=true" + //Commands #define NC_RDF_DELETE "http://home.netscape.com/NC-rdf#Delete" #define NC_RDF_NEWCADR "http://home.netscape.com/NC-rdf#NewCard" @@ -80,12 +87,22 @@ nsAbCardDataSource::~nsAbCardDataSource (void) nsrefcnt refcnt; - NS_RELEASE2(kNC_DisplayName, refcnt); - NS_RELEASE2(kNC_PrimaryEmail, refcnt); - NS_RELEASE2(kNC_WorkPhone, refcnt); + if (kNC_DisplayName) + NS_RELEASE2(kNC_DisplayName, refcnt); + if (kNC_PrimaryEmail) + NS_RELEASE2(kNC_PrimaryEmail, refcnt); + if (kNC_WorkPhone) + NS_RELEASE2(kNC_WorkPhone, refcnt); + + if (kNC_DisplayNameCollation) + NS_RELEASE2(kNC_DisplayNameCollation, refcnt); + if (kNC_PrimaryEmailCollation) + NS_RELEASE2(kNC_PrimaryEmailCollation, refcnt); - NS_RELEASE2(kNC_Delete, refcnt); - NS_RELEASE2(kNC_NewCard, refcnt); + if (kNC_Delete) + NS_RELEASE2(kNC_Delete, refcnt); + if (kNC_NewCard) + NS_RELEASE2(kNC_NewCard, refcnt); } @@ -111,6 +128,9 @@ nsresult nsAbCardDataSource::Init() mRDFService->GetResource(NC_RDF_PRIMARYEMAIL, &kNC_PrimaryEmail); mRDFService->GetResource(NC_RDF_WORKNAME, &kNC_WorkPhone); + mRDFService->GetResource(NC_RDF_DISPLAYNAME_SORT, &kNC_DisplayNameCollation); + mRDFService->GetResource(NC_RDF_PRIMARYEMAIL_SORT, &kNC_PrimaryEmailCollation); + mRDFService->GetResource(NC_RDF_DELETE, &kNC_Delete); mRDFService->GetResource(NC_RDF_NEWCADR, &kNC_NewCard); } @@ -378,23 +398,44 @@ nsresult nsAbCardDataSource::createCardNode(nsIAbCard* card, nsIRDFResource* property, nsIRDFNode** target) { - PRUnichar *name = nsnull; - nsresult rv = NS_RDF_NO_VALUE; - - if ((kNC_DisplayName == property)) - rv = card->GetDisplayName(&name); - else if ((kNC_PrimaryEmail == property)) - rv = card->GetPrimaryEmail(&name); - else if ((kNC_WorkPhone == property)) - rv = card->GetWorkPhone(&name); - if (NS_FAILED(rv)) return rv; - if (name) - { - nsString nameString(name); - createNode(nameString, target); - delete[] name; - } - return rv; + PRUnichar *name = nsnull; + nsresult rv = NS_RDF_NO_VALUE; + + if ((kNC_DisplayName == property)) + rv = card->GetDisplayName(&name); + else if ((kNC_PrimaryEmail == property)) + rv = card->GetPrimaryEmail(&name); + else if ((kNC_WorkPhone == property)) + rv = card->GetWorkPhone(&name); + else if (kNC_DisplayNameCollation == property) + { + PRUnichar *tempStr = nsnull; + rv = card->GetDisplayName(&tempStr); + if (tempStr) + { + rv = card->GetCollationKey(tempStr, &name); + nsCRT::free(tempStr); + } + } + else if (kNC_PrimaryEmailCollation == property) + { + PRUnichar *tempStr = nsnull; + rv = card->GetPrimaryEmail(&tempStr); + if (tempStr) + { + rv = card->GetCollationKey(tempStr, &name); + nsCRT::free(tempStr); + } + } + if (NS_FAILED(rv)) + return rv; + if (name) + { + nsString nameString(name); + createNode(nameString, target); + nsCRT::free(name); + } + return rv; } nsresult nsAbCardDataSource::DoDeleteFromCard(nsIAbCard *card, nsISupportsArray *arguments) diff --git a/mailnews/addrbook/src/nsCardDataSource.h b/mailnews/addrbook/src/nsCardDataSource.h index 04c907a73162..42074a28a333 100644 --- a/mailnews/addrbook/src/nsCardDataSource.h +++ b/mailnews/addrbook/src/nsCardDataSource.h @@ -103,6 +103,9 @@ protected: static nsIRDFResource* kNC_City; static nsIRDFResource* kNC_Nickname; + static nsIRDFResource* kNC_DisplayNameCollation; + static nsIRDFResource* kNC_PrimaryEmailCollation; + // commands static nsIRDFResource* kNC_Delete; static nsIRDFResource* kNC_NewCard;