Fix Bug 12882 International sort doesn't work for Address Book

This commit is contained in:
chuang%netscape.com 1999-09-16 03:49:47 +00:00
Родитель 8918c275ee
Коммит 30f1f5a0f2
5 изменённых файлов: 110 добавлений и 22 удалений

Просмотреть файл

@ -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);
};

Просмотреть файл

@ -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<nsILocale> locale;
nsCOMPtr<nsICollation> 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 <nsICollationFactory> 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;
}

Просмотреть файл

@ -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:

Просмотреть файл

@ -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)

Просмотреть файл

@ -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;