Home | History | Annotate | Download | only in common
      1 //  2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html
      3 /**
      4  *******************************************************************************
      5  * Copyright (C) 2001-2014, International Business Machines Corporation and    *
      6  * others. All Rights Reserved.                                                *
      7  *******************************************************************************
      8  *
      9  *******************************************************************************
     10  */
     11 #include "unicode/utypes.h"
     12 
     13 #if !UCONFIG_NO_SERVICE
     14 
     15 #include "unicode/resbund.h"
     16 #include "uresimp.h"
     17 #include "cmemory.h"
     18 #include "servloc.h"
     19 #include "ustrfmt.h"
     20 #include "uhash.h"
     21 #include "charstr.h"
     22 #include "ucln_cmn.h"
     23 #include "uassert.h"
     24 
     25 #define UNDERSCORE_CHAR ((UChar)0x005f)
     26 #define AT_SIGN_CHAR    ((UChar)64)
     27 #define PERIOD_CHAR     ((UChar)46)
     28 
     29 
     30 U_NAMESPACE_BEGIN
     31 
     32 LocaleKeyFactory::LocaleKeyFactory(int32_t coverage)
     33   : _name()
     34   , _coverage(coverage)
     35 {
     36 }
     37 
     38 LocaleKeyFactory::LocaleKeyFactory(int32_t coverage, const UnicodeString& name)
     39   : _name(name)
     40   , _coverage(coverage)
     41 {
     42 }
     43 
     44 LocaleKeyFactory::~LocaleKeyFactory() {
     45 }
     46 
     47 UObject*
     48 LocaleKeyFactory::create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const {
     49     if (handlesKey(key, status)) {
     50         const LocaleKey& lkey = (const LocaleKey&)key;
     51         int32_t kind = lkey.kind();
     52         Locale loc;
     53         lkey.currentLocale(loc);
     54 
     55         return handleCreate(loc, kind, service, status);
     56     }
     57     return NULL;
     58 }
     59 
     60 UBool
     61 LocaleKeyFactory::handlesKey(const ICUServiceKey& key, UErrorCode& status) const {
     62     const Hashtable* supported = getSupportedIDs(status);
     63     if (supported) {
     64         UnicodeString id;
     65         key.currentID(id);
     66         return supported->get(id) != NULL;
     67     }
     68     return FALSE;
     69 }
     70 
     71 void
     72 LocaleKeyFactory::updateVisibleIDs(Hashtable& result, UErrorCode& status) const {
     73     const Hashtable* supported = getSupportedIDs(status);
     74     if (supported) {
     75         UBool visible = (_coverage & 0x1) == 0;
     76         const UHashElement* elem = NULL;
     77         int32_t pos = UHASH_FIRST;
     78         while ((elem = supported->nextElement(pos)) != NULL) {
     79             const UnicodeString& id = *((const UnicodeString*)elem->key.pointer);
     80             if (!visible) {
     81                 result.remove(id);
     82             } else {
     83                 result.put(id, (void*)this, status); // this is dummy non-void marker used for set semantics
     84                 if (U_FAILURE(status)) {
     85                     break;
     86                 }
     87             }
     88         }
     89     }
     90 }
     91 
     92 UnicodeString&
     93 LocaleKeyFactory::getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const {
     94     if ((_coverage & 0x1) == 0) {
     95         //UErrorCode status = U_ZERO_ERROR;
     96         // assume if this is called on us, we support some fallback of this id
     97         // if (isSupportedID(id, status)) {
     98             Locale loc;
     99             LocaleUtility::initLocaleFromName(id, loc);
    100             return loc.getDisplayName(locale, result);
    101         // }
    102     }
    103     result.setToBogus();
    104     return result;
    105 }
    106 
    107 UObject*
    108 LocaleKeyFactory::handleCreate(const Locale& /* loc */,
    109                    int32_t /* kind */,
    110                    const ICUService* /* service */,
    111                    UErrorCode& /* status */) const {
    112     return NULL;
    113 }
    114 
    115 //UBool
    116 //LocaleKeyFactory::isSupportedID(const UnicodeString& id, UErrorCode& status) const {
    117 //    const Hashtable* ids = getSupportedIDs(status);
    118 //    return ids && ids->get(id);
    119 //}
    120 
    121 const Hashtable*
    122 LocaleKeyFactory::getSupportedIDs(UErrorCode& /* status */) const {
    123     return NULL;
    124 }
    125 
    126 #ifdef SERVICE_DEBUG
    127 UnicodeString&
    128 LocaleKeyFactory::debug(UnicodeString& result) const
    129 {
    130     debugClass(result);
    131     result.append((UnicodeString)", name: ");
    132     result.append(_name);
    133     result.append((UnicodeString)", coverage: ");
    134     result.append(_coverage);
    135     return result;
    136 }
    137 
    138 UnicodeString&
    139 LocaleKeyFactory::debugClass(UnicodeString& result) const
    140 {
    141   return result.append((UnicodeString)"LocaleKeyFactory");
    142 }
    143 #endif
    144 
    145 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKeyFactory)
    146 
    147 U_NAMESPACE_END
    148 
    149 /* !UCONFIG_NO_SERVICE */
    150 #endif
    151 
    152 
    153