Index: icu46/source/common/servlkf.cpp |
=================================================================== |
--- icu46/source/common/servlkf.cpp (revision 0) |
+++ icu46/source/common/servlkf.cpp (revision 0) |
@@ -0,0 +1,151 @@ |
+/** |
+ ******************************************************************************* |
+ * Copyright (C) 2001-2005, International Business Machines Corporation and * |
+ * others. All Rights Reserved. * |
+ ******************************************************************************* |
+ * |
+ ******************************************************************************* |
+ */ |
+#include "unicode/utypes.h" |
+ |
+#if !UCONFIG_NO_SERVICE |
+ |
+#include "unicode/resbund.h" |
+#include "uresimp.h" |
+#include "cmemory.h" |
+#include "servloc.h" |
+#include "ustrfmt.h" |
+#include "uhash.h" |
+#include "charstr.h" |
+#include "ucln_cmn.h" |
+#include "uassert.h" |
+ |
+#define UNDERSCORE_CHAR ((UChar)0x005f) |
+#define AT_SIGN_CHAR ((UChar)64) |
+#define PERIOD_CHAR ((UChar)46) |
+ |
+ |
+U_NAMESPACE_BEGIN |
+ |
+LocaleKeyFactory::LocaleKeyFactory(int32_t coverage) |
+ : _name() |
+ , _coverage(coverage) |
+{ |
+} |
+ |
+LocaleKeyFactory::LocaleKeyFactory(int32_t coverage, const UnicodeString& name) |
+ : _name(name) |
+ , _coverage(coverage) |
+{ |
+} |
+ |
+LocaleKeyFactory::~LocaleKeyFactory() { |
+} |
+ |
+UObject* |
+LocaleKeyFactory::create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const { |
+ if (handlesKey(key, status)) { |
+ const LocaleKey& lkey = (const LocaleKey&)key; |
+ int32_t kind = lkey.kind(); |
+ Locale loc; |
+ lkey.currentLocale(loc); |
+ |
+ return handleCreate(loc, kind, service, status); |
+ } |
+ return NULL; |
+} |
+ |
+UBool |
+LocaleKeyFactory::handlesKey(const ICUServiceKey& key, UErrorCode& status) const { |
+ const Hashtable* supported = getSupportedIDs(status); |
+ if (supported) { |
+ UnicodeString id; |
+ key.currentID(id); |
+ return supported->get(id) != NULL; |
+ } |
+ return FALSE; |
+} |
+ |
+void |
+LocaleKeyFactory::updateVisibleIDs(Hashtable& result, UErrorCode& status) const { |
+ const Hashtable* supported = getSupportedIDs(status); |
+ if (supported) { |
+ UBool visible = (_coverage & 0x1) == 0; |
+ |
+ const UHashElement* elem = NULL; |
+ int32_t pos = 0; |
+ while ((elem = supported->nextElement(pos)) != NULL) { |
+ const UnicodeString& id = *((const UnicodeString*)elem->key.pointer); |
+ if (!visible) { |
+ result.remove(id); |
+ } else { |
+ result.put(id, (void*)this, status); // this is dummy non-void marker used for set semantics |
+ if (U_FAILURE(status)) { |
+ break; |
+ } |
+ } |
+ } |
+ } |
+} |
+ |
+UnicodeString& |
+LocaleKeyFactory::getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const { |
+ if ((_coverage & 0x1) == 0) { |
+ //UErrorCode status = U_ZERO_ERROR; |
+ // assume if this is called on us, we support some fallback of this id |
+ // if (isSupportedID(id, status)) { |
+ Locale loc; |
+ LocaleUtility::initLocaleFromName(id, loc); |
+ return loc.getDisplayName(locale, result); |
+ // } |
+ } |
+ result.setToBogus(); |
+ return result; |
+} |
+ |
+UObject* |
+LocaleKeyFactory::handleCreate(const Locale& /* loc */, |
+ int32_t /* kind */, |
+ const ICUService* /* service */, |
+ UErrorCode& /* status */) const { |
+ return NULL; |
+} |
+ |
+//UBool |
+//LocaleKeyFactory::isSupportedID(const UnicodeString& id, UErrorCode& status) const { |
+// const Hashtable* ids = getSupportedIDs(status); |
+// return ids && ids->get(id); |
+//} |
+ |
+const Hashtable* |
+LocaleKeyFactory::getSupportedIDs(UErrorCode& /* status */) const { |
+ return NULL; |
+} |
+ |
+#ifdef SERVICE_DEBUG |
+UnicodeString& |
+LocaleKeyFactory::debug(UnicodeString& result) const |
+{ |
+ debugClass(result); |
+ result.append(", name: "); |
+ result.append(_name); |
+ result.append(", coverage: "); |
+ result.append(_coverage); |
+ return result; |
+} |
+ |
+UnicodeString& |
+LocaleKeyFactory::debugClass(UnicodeString& result) const |
+{ |
+ return result.append("LocaleKeyFactory"); |
+} |
+#endif |
+ |
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKeyFactory) |
+ |
+U_NAMESPACE_END |
+ |
+/* !UCONFIG_NO_SERVICE */ |
+#endif |
+ |
+ |
Property changes on: icu46/source/common/servlkf.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |