ICU-2755 ucol_open should fetch registered collators, still need to add test

X-SVN-Rev: 11838
This commit is contained in:
Doug Felt 2003-05-08 17:31:45 +00:00
parent 8e183cbc6e
commit fdc637b53d
5 changed files with 51 additions and 4 deletions

View file

@ -165,6 +165,29 @@ hasService(void)
return gService != NULL;
}
// -------------------------------------
UCollator*
Collator::createUCollator(const char *loc,
UErrorCode *status)
{
UCollator *result = 0;
if (status && U_SUCCESS(*status) && hasService()) {
Locale desiredLocale(loc);
Collator *col = (Collator*)gService->get(desiredLocale, *status);
if (col && col->getDynamicClassID() == RuleBasedCollator::getStaticClassID()) {
RuleBasedCollator *rbc = (RuleBasedCollator *)col;
if (!rbc->dataIsOwned) {
result = ucol_safeClone(rbc->ucollator, NULL, NULL, status);
} else {
result = rbc->ucollator;
rbc->ucollator = NULL; // to prevent free on delete
}
}
delete col;
}
return result;
}
// Collator public methods -----------------------------------------------

View file

@ -336,17 +336,28 @@ tryOpeningFromRules(UResourceBundle *collElem, UErrorCode *status) {
}
U_CAPI UCollator* U_EXPORT2
ucol_open( const char *loc,
UErrorCode *status)
U_NAMESPACE_BEGIN
U_CAPI UCollator*
ucol_open(const char *loc,
UErrorCode *status)
{
U_NAMESPACE_USE;
UCollator *result = NULL;
if (status && U_SUCCESS(*status)) {
result = Collator::createUCollator(loc, status);
if (result) {
return result;
}
}
ucol_initUCA(status);
/* New version */
if(U_FAILURE(*status)) return 0;
UCollator *result = NULL;
UResourceBundle *b = ures_open(NULL, loc, status);
UResourceBundle *collElem = ures_getByKey(b, "CollationElements", NULL, status);
UResourceBundle *binary = NULL;
@ -431,6 +442,7 @@ clean:
ures_close(binary);
return result;
}
U_NAMESPACE_END
U_CAPI void U_EXPORT2
ucol_setReqValidLocales(UCollator *coll, char *requestedLocaleToAdopt, char *validLocaleToAdopt)

View file

@ -361,6 +361,10 @@ ucol_getSortKeySize(const UCollator *coll, collIterate *s,
U_CAPI uint8_t* U_EXPORT2
ucol_cloneRuleData(const UCollator *coll, int32_t *length, UErrorCode *status);
/**
* Used to set requested and valid locales on a collator returned by the collator
* service.
*/
U_CAPI void U_EXPORT2
ucol_setReqValidLocales(UCollator *coll, char *requestedLocaleToAdopt, char *validLocaleToAdopt);

View file

@ -861,6 +861,13 @@ protected:
*/
virtual void setLocales(const Locale& requestedLocale, const Locale& validLocale);
public:
/**
* used only by ucol_open, not for public use
* @internal
*/
static UCollator* createUCollator(const char* loc, UErrorCode* status);
private:
/**
* Assignment operator. Private for now.

View file

@ -59,6 +59,7 @@
#if !UCONFIG_NO_COLLATION
#include "unicode/coll.h"
#include "unicode/ucol.h"
#include "unicode/sortkey.h"
#include "unicode/normlzr.h"