зеркало из https://github.com/mozilla/gecko-dev.git
Fix Bug 12882 International sort doesn't work for Address Book
This commit is contained in:
Родитель
8918c275ee
Коммит
30f1f5a0f2
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче