16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ******************************************************************************* 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (C) 2001-2011, International Business Machines Corporation. * 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * All Rights Reserved. * 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ******************************************************************************* 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef ICUSERV_H 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ICUSERV_H 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if UCONFIG_NO_SERVICE 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Allow the declaration of APIs with pointers to ICUService 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * even when service is removed from the build. 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ICUService; 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h" 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/locid.h" 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/umisc.h" 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "hash.h" 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uvector.h" 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "servnotf.h" 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ICUServiceTest; 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ICUServiceKey; 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ICUServiceFactory; 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass SimpleFactory; 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ServiceListener; 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ICUService; 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass DNCache; 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/******************************************************************* 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICUServiceKey 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>ICUServiceKeys are used to communicate with factories to 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * generate an instance of the service. ICUServiceKeys define how 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ids are canonicalized, provide both a current id and a current 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * descriptor to use in querying the cache and factories, and 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * determine the fallback strategy.</p> 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>ICUServiceKeys provide both a currentDescriptor and a currentID. 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The descriptor contains an optional prefix, followed by '/' 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and the currentID. Factories that handle complex keys, 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * for example number format factories that generate multiple 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * kinds of formatters for the same locale, use the descriptor 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * to provide a fully unique identifier for the service object, 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * while using the currentID (in this case, the locale string), 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * as the visible IDs that can be localized.</p> 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The default implementation of ICUServiceKey has no fallbacks and 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * has no custom descriptors.</p> 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_COMMON_API ICUServiceKey : public UObject { 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private: 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString _id; 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org protected: 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar PREFIX_DELIMITER; 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public: 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Construct a key from an id.</p> 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param id the ID from which to construct the key. 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ICUServiceKey(const UnicodeString& id); 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Virtual destructor.</p> 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~ICUServiceKey(); 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Return the original ID used to construct this key.</p> 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the ID used to construct this key. 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual const UnicodeString& getID() const; 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Return the canonical version of the original ID. This implementation 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * appends the original ID to result. Result is returned as a convenience.</p> 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result the output parameter to which the id will be appended. 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the modified result. 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UnicodeString& canonicalID(UnicodeString& result) const; 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Return the (canonical) current ID. This implementation appends 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the canonical ID to result. Result is returned as a convenience.</p> 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result the output parameter to which the current id will be appended. 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the modified result. 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UnicodeString& currentID(UnicodeString& result) const; 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Return the current descriptor. This implementation appends 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the current descriptor to result. Result is returned as a convenience.</p> 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The current descriptor is used to fully 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * identify an instance of the service in the cache. A 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * factory may handle all descriptors for an ID, or just a 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * particular descriptor. The factory can either parse the 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * descriptor or use custom API on the key in order to 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * instantiate the service.</p> 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result the output parameter to which the current id will be appended. 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the modified result. 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UnicodeString& currentDescriptor(UnicodeString& result) const; 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>If the key has a fallback, modify the key and return true, 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * otherwise return false. The current ID will change if there 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * is a fallback. No currentIDs should be repeated, and fallback 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * must eventually return false. This implementation has no fallbacks 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and always returns false.</p> 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if the ICUServiceKey changed to a valid fallback value. 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UBool fallback(); 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Return TRUE if a key created from id matches, or would eventually 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * fallback to match, the canonical ID of this ICUServiceKey.</p> 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param id the id to test. 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if this ICUServiceKey's canonical ID is a fallback of id. 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UBool isFallbackOf(const UnicodeString& id) const; 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Return the prefix. This implementation leaves result unchanged. 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Result is returned as a convenience.</p> 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result the output parameter to which the prefix will be appended. 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the modified result. 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UnicodeString& prefix(UnicodeString& result) const; 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>A utility to parse the prefix out of a descriptor string. Only 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the (undelimited) prefix, if any, remains in result. Result is returned as a 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * convenience.</p> 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result an input/output parameter that on entry is a descriptor, and 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * on exit is the prefix of that descriptor. 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the modified result. 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UnicodeString& parsePrefix(UnicodeString& result); 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>A utility to parse the suffix out of a descriptor string. Only 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the (undelimited) suffix, if any, remains in result. Result is returned as a 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * convenience.</p> 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result an input/output parameter that on entry is a descriptor, and 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * on exit is the suffix of that descriptor. 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the modified result. 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UnicodeString& parseSuffix(UnicodeString& result); 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UObject RTTI boilerplate. 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UClassID U_EXPORT2 getStaticClassID(); 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UObject RTTI boilerplate. 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UClassID getDynamicClassID() const; 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef SERVICE_DEBUG 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public: 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UnicodeString& debug(UnicodeString& result) const; 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UnicodeString& debugClass(UnicodeString& result) const; 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /******************************************************************* 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICUServiceFactory 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>An implementing ICUServiceFactory generates the service objects maintained by the 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * service. A factory generates a service object from a key, 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * updates id->factory mappings, and returns the display name for 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a supported id.</p> 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_COMMON_API ICUServiceFactory : public UObject { 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public: 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~ICUServiceFactory(); 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Create a service object from the key, if this factory 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * supports the key. Otherwise, return NULL.</p> 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>If the factory supports the key, then it can call 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the service's getKey(ICUServiceKey, String[], ICUServiceFactory) method 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * passing itself as the factory to get the object that 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the service would have created prior to the factory's 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * registration with the service. This can change the 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * key, so any information required from the key should 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * be extracted before making such a callback.</p> 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param key the service key. 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param service the service with which this factory is registered. 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the service object, or NULL if the factory does not support the key. 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const = 0; 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Update result to reflect the IDs (not descriptors) that this 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * factory publicly handles. Result contains mappings from ID to 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * factory. On entry it will contain all (visible) mappings from 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * previously-registered factories.</p> 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>This function, together with getDisplayName, are used to 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * support ICUService::getDisplayNames. The factory determines 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * which IDs (of those it supports) it will make visible, and of 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * those, which it will provide localized display names for. In 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * most cases it will register mappings from all IDs it supports 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * to itself.</p> 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result the mapping table to update. 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void updateVisibleIDs(Hashtable& result, UErrorCode& status) const = 0; 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Return, in result, the display name of the id in the provided locale. 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This is an id, not a descriptor. If the id is 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * not visible, sets result to bogus. If the 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * incoming result is bogus, it remains bogus. Result is returned as a 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * convenience. Results are not defined if id is not one supported by this 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * factory.</p> 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param id a visible id supported by this factory. 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param locale the locale for which to generate the corresponding localized display name. 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result output parameter to hold the display name. 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return result. 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UnicodeString& getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const = 0; 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ****************************************************************** 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>A default implementation of factory. This provides default 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * implementations for subclasses, and implements a singleton 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * factory that matches a single ID and returns a single 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (possibly deferred-initialized) instance. This implements 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * updateVisibleIDs to add a mapping from its ID to itself 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * if visible is true, or to remove any existing mapping 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * for its ID if visible is false. No localization of display 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * names is performed.</p> 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_COMMON_API SimpleFactory : public ICUServiceFactory { 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org protected: 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UObject* _instance; 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString _id; 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UBool _visible; 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public: 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Construct a SimpleFactory that maps a single ID to a single 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * service instance. If visible is TRUE, the ID will be visible. 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The instance must not be NULL. The SimpleFactory will adopt 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the instance, which must not be changed subsequent to this call.</p> 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param instanceToAdopt the service instance to adopt. 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param id the ID to assign to this service instance. 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param visible if TRUE, the ID will be visible. 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleFactory(UObject* instanceToAdopt, const UnicodeString& id, UBool visible = TRUE); 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Destructor.</p> 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~SimpleFactory(); 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>This implementation returns a clone of the service instance if the factory's ID is equal to 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the key's currentID. Service and prefix are ignored.</p> 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param key the service key. 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param service the service with which this factory is registered. 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the service object, or NULL if the factory does not support the key. 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UObject* create(const ICUServiceKey& key, const ICUService* service, UErrorCode& status) const; 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>This implementation adds a mapping from ID -> this to result if visible is TRUE, 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * otherwise it removes ID from result.</p> 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result the mapping table to update. 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void updateVisibleIDs(Hashtable& result, UErrorCode& status) const; 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>This implementation returns the factory ID if it equals id and visible is TRUE, 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * otherwise it returns the empty string. (This implementation provides 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * no localized id information.)</p> 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param id a visible id supported by this factory. 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param locale the locale for which to generate the corresponding localized display name. 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result output parameter to hold the display name. 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return result. 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UnicodeString& getDisplayName(const UnicodeString& id, const Locale& locale, UnicodeString& result) const; 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UObject RTTI boilerplate. 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UClassID U_EXPORT2 getStaticClassID(); 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UObject RTTI boilerplate. 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UClassID getDynamicClassID() const; 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef SERVICE_DEBUG 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public: 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UnicodeString& debug(UnicodeString& toAppendTo) const; 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UnicodeString& debugClass(UnicodeString& toAppendTo) const; 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ****************************************************************** 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>ServiceListener is the listener that ICUService provides by default. 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICUService will notifiy this listener when factories are added to 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * or removed from the service. Subclasses can provide 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * different listener interfaces that extend EventListener, and modify 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * acceptsListener and notifyListener as appropriate.</p> 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_COMMON_API ServiceListener : public EventListener { 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~ServiceListener(); 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>This method is called when the service changes. At the time of the 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * call this listener is registered with the service. It must 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * not modify the notifier in the context of this call.</p> 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param service the service that changed. 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void serviceChanged(const ICUService& service) const = 0; 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UObject RTTI boilerplate. 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UClassID U_EXPORT2 getStaticClassID(); 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UObject RTTI boilerplate. 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UClassID getDynamicClassID() const; 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ****************************************************************** 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>A StringPair holds a displayName/ID pair. ICUService uses it 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * as the array elements returned by getDisplayNames. 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_COMMON_API StringPair : public UMemory { 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The display name of the pair.</p> 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString displayName; 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The ID of the pair.</p> 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString id; 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Creates a string pair from a displayName and an ID.</p> 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param displayName the displayName. 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param id the ID. 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return a StringPair if the creation was successful, otherwise NULL. 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static StringPair* create(const UnicodeString& displayName, 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& id, 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode& status); 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Return TRUE if either string of the pair is bogus.</p> 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if either string of the pair is bogus. 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isBogus() const; 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringPair(const UnicodeString& displayName, const UnicodeString& id); 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/******************************************************************* 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICUService 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>A Service provides access to service objects that implement a 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * particular service, e.g. transliterators. Users provide a String 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * id (for example, a locale string) to the service, and get back an 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * object for that id. Service objects can be any kind of object. A 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * new service object is returned for each query. The caller is 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * responsible for deleting it.</p> 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Services 'canonicalize' the query ID and use the canonical ID to 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * query for the service. The service also defines a mechanism to 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 'fallback' the ID multiple times. Clients can optionally request 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the actual ID that was matched by a query when they use an ID to 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * retrieve a service object.</p> 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Service objects are instantiated by ICUServiceFactory objects 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * registered with the service. The service queries each 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICUServiceFactory in turn, from most recently registered to 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * earliest registered, until one returns a service object. If none 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * responds with a service object, a fallback ID is generated, and the 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * process repeats until a service object is returned or until the ID 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * has no further fallbacks.</p> 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>In ICU 2.4, UObject (the base class of service instances) does 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * not define a polymorphic clone function. ICUService uses clones to 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * manage ownership. Thus, for now, ICUService defines an abstract 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * method, cloneInstance, that clients must implement to create clones 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * of the service instances. This may change in future releases of 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICU.</p> 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>ICUServiceFactories can be dynamically registered and 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * unregistered with the service. When registered, an 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICUServiceFactory is installed at the head of the factory list, and 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * so gets 'first crack' at any keys or fallback keys. When 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * unregistered, it is removed from the service and can no longer be 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * located through it. Service objects generated by this factory and 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * held by the client are unaffected.</p> 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>If a service has variants (e.g., the different variants of 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * BreakIterator) an ICUServiceFactory can use the prefix of the 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICUServiceKey to determine the variant of a service to generate. 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If it does not support all variants, it can request 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * previously-registered factories to handle the ones it does not 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * support.</p> 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>ICUService uses ICUServiceKeys to query factories and perform 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * fallback. The ICUServiceKey defines the canonical form of the ID, 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and implements the fallback strategy. Custom ICUServiceKeys can be 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * defined that parse complex IDs into components that 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICUServiceFactories can more easily use. The ICUServiceKey can 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * cache the results of this parsing to save repeated effort. 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICUService provides convenience APIs that take UnicodeStrings and 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * generate default ICUServiceKeys for use in querying.</p> 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>ICUService provides API to get the list of IDs publicly 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * supported by the service (although queries aren't restricted to 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * this list). This list contains only 'simple' IDs, and not fully 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * unique IDs. ICUServiceFactories are associated with each simple ID 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and the responsible factory can also return a human-readable 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * localized version of the simple ID, for use in user interfaces. 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICUService can also provide an array of the all the localized 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * visible IDs and their corresponding internal IDs.</p> 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>ICUService implements ICUNotifier, so that clients can register 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * to receive notification when factories are added or removed from 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the service. ICUService provides a default EventListener 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * subinterface, ServiceListener, which can be registered with the 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * service. When the service changes, the ServiceListener's 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * serviceChanged method is called with the service as the 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * argument.</p> 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The ICUService API is both rich and generic, and it is expected 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * that most implementations will statically 'wrap' ICUService to 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * present a more appropriate API-- for example, to declare the type 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * of the objects returned from get, to limit the factories that can 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * be registered with the service, or to define their own listener 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * interface with a custom callback method. They might also customize 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICUService by overriding it, for example, to customize the 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICUServiceKey and fallback strategy. ICULocaleService is a 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * subclass of ICUService that uses Locale names as IDs and uses 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICUServiceKeys that implement the standard resource bundle fallback 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * strategy. Most clients will wish to subclass it instead of 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICUService.</p> 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_COMMON_API ICUService : public ICUNotifier { 5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org protected: 5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Name useful for debugging. 5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString name; 5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private: 5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Timestamp so iterators can be fail-fast. 5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t timestamp; 5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * All the factories registered with this service. 5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVector* factories; 5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The service cache. 5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Hashtable* serviceCache; 5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The ID cache. 5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Hashtable* idCache; 5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The name cache. 5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DNCache* dnCache; 5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Constructor. 5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public: 5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Construct a new ICUService.</p> 5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ICUService(); 5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Construct with a name (useful for debugging).</p> 5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param name a name to use in debugging. 5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ICUService(const UnicodeString& name); 5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Destructor.</p> 5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~ICUService(); 5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Return the name of this service. This will be the empty string if none was assigned. 5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns result as a convenience.</p> 5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result an output parameter to contain the name of this service. 5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the name of this service. 5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString& getName(UnicodeString& result) const; 5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Convenience override for get(ICUServiceKey&, UnicodeString*). This uses 5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * createKey to create a key for the provided descriptor.</p> 5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param descriptor the descriptor. 5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the service instance, or NULL. 5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UObject* get(const UnicodeString& descriptor, UErrorCode& status) const; 5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Convenience override for get(ICUServiceKey&, UnicodeString*). This uses 6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * createKey to create a key from the provided descriptor.</p> 6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param descriptor the descriptor. 6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param actualReturn a pointer to a UnicodeString to hold the matched descriptor, or NULL. 6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the service instance, or NULL. 6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UObject* get(const UnicodeString& descriptor, UnicodeString* actualReturn, UErrorCode& status) const; 6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Convenience override for get(ICUServiceKey&, UnicodeString*).</p> 6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param key the key. 6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the service instance, or NULL. 6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UObject* getKey(ICUServiceKey& key, UErrorCode& status) const; 6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Given a key, return a service object, and, if actualReturn 6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * is not NULL, the descriptor with which it was found in the 6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * first element of actualReturn. If no service object matches 6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * this key, returns NULL and leaves actualReturn unchanged.</p> 6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>This queries the cache using the key's descriptor, and if no 6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * object in the cache matches, tries the key on each 6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * registered factory, in order. If none generates a service 6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * object for the key, repeats the process with each fallback of 6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the key, until either a factory returns a service object, or the key 6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * has no fallback. If no object is found, the result of handleDefault 6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * is returned.</p> 6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Subclasses can override this method to further customize the 6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * result before returning it. 6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param key the key. 6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param actualReturn a pointer to a UnicodeString to hold the matched descriptor, or NULL. 6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the service instance, or NULL. 6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UObject* getKey(ICUServiceKey& key, UnicodeString* actualReturn, UErrorCode& status) const; 6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>This version of getKey is only called by ICUServiceFactories within the scope 6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * of a previous getKey call, to determine what previously-registered factories would 6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * have returned. For details, see getKey(ICUServiceKey&, UErrorCode&). Subclasses 6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * should not call it directly, but call through one of the other get functions.</p> 6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param key the key. 6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param actualReturn a pointer to a UnicodeString to hold the matched descriptor, or NULL. 6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param factory the factory making the recursive call. 6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the service instance, or NULL. 6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UObject* getKey(ICUServiceKey& key, UnicodeString* actualReturn, const ICUServiceFactory* factory, UErrorCode& status) const; 6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Convenience override for getVisibleIDs(String) that passes null 6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * as the fallback, thus returning all visible IDs.</p> 6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result a vector to hold the returned IDs. 6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the result vector. 6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVector& getVisibleIDs(UVector& result, UErrorCode& status) const; 6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Return a snapshot of the visible IDs for this service. This 6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * list will not change as ICUServiceFactories are added or removed, but the 6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * supported IDs will, so there is no guarantee that all and only 6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the IDs in the returned list will be visible and supported by the 6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * service in subsequent calls.</p> 6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The IDs are returned as pointers to UnicodeStrings. The 6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * caller owns the IDs. Previous contents of result are discarded before 6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * new elements, if any, are added.</p> 6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>matchID is passed to createKey to create a key. If the key 6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * is not NULL, its isFallbackOf method is used to filter out IDs 6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * that don't match the key or have it as a fallback.</p> 6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result a vector to hold the returned IDs. 6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param matchID an ID used to filter the result, or NULL if all IDs are desired. 6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the result vector. 6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVector& getVisibleIDs(UVector& result, const UnicodeString* matchID, UErrorCode& status) const; 6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Convenience override for getDisplayName(const UnicodeString&, const Locale&, UnicodeString&) that 6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * uses the current default locale.</p> 6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param id the ID for which to retrieve the localized displayName. 6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result an output parameter to hold the display name. 6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the modified result. 6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString& getDisplayName(const UnicodeString& id, UnicodeString& result) const; 6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Given a visible ID, return the display name in the requested locale. 7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If there is no directly supported ID corresponding to this ID, result is 7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * set to bogus.</p> 7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param id the ID for which to retrieve the localized displayName. 7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result an output parameter to hold the display name. 7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param locale the locale in which to localize the ID. 7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the modified result. 7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString& getDisplayName(const UnicodeString& id, UnicodeString& result, const Locale& locale) const; 7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Convenience override of getDisplayNames(const Locale&, const UnicodeString*) that 7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * uses the current default Locale as the locale and NULL for 7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the matchID.</p> 7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result a vector to hold the returned displayName/id StringPairs. 7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the modified result vector. 7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVector& getDisplayNames(UVector& result, UErrorCode& status) const; 7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Convenience override of getDisplayNames(const Locale&, const UnicodeString*) that 7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * uses NULL for the matchID.</p> 7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result a vector to hold the returned displayName/id StringPairs. 7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param locale the locale in which to localize the ID. 7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the modified result vector. 7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVector& getDisplayNames(UVector& result, const Locale& locale, UErrorCode& status) const; 7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Return a snapshot of the mapping from display names to visible 7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * IDs for this service. This set will not change as factories 7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * are added or removed, but the supported IDs will, so there is 7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * no guarantee that all and only the IDs in the returned map will 7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * be visible and supported by the service in subsequent calls, 7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * nor is there any guarantee that the current display names match 7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * those in the result.</p> 7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The names are returned as pointers to StringPairs, which 7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * contain both the displayName and the corresponding ID. The 7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * caller owns the StringPairs. Previous contents of result are 7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * discarded before new elements, if any, are added.</p> 7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>matchID is passed to createKey to create a key. If the key 7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * is not NULL, its isFallbackOf method is used to filter out IDs 7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * that don't match the key or have it as a fallback.</p> 7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param result a vector to hold the returned displayName/id StringPairs. 7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param locale the locale in which to localize the ID. 7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param matchID an ID used to filter the result, or NULL if all IDs are desired. 7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the result vector. */ 7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVector& getDisplayNames(UVector& result, 7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const Locale& locale, 7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString* matchID, 7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode& status) const; 7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>A convenience override of registerInstance(UObject*, const UnicodeString&, UBool) 7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * that defaults visible to TRUE.</p> 7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param objToAdopt the object to register and adopt. 7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param id the ID to assign to this object. 7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return a registry key that can be passed to unregister to unregister 7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (and discard) this instance. 7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org URegistryKey registerInstance(UObject* objToAdopt, const UnicodeString& id, UErrorCode& status); 7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Register a service instance with the provided ID. The ID will be 7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * canonicalized. The canonicalized ID will be returned by 7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * getVisibleIDs if visible is TRUE. The service instance will be adopted and 7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * must not be modified subsequent to this call.</p> 7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>This issues a serviceChanged notification to registered listeners.</p> 7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>This implementation wraps the object using 7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * createSimpleFactory, and calls registerFactory.</p> 7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param objToAdopt the object to register and adopt. 7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param id the ID to assign to this object. 7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param visible TRUE if getVisibleIDs is to return this ID. 7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return a registry key that can be passed to unregister() to unregister 7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (and discard) this instance. 7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual URegistryKey registerInstance(UObject* objToAdopt, const UnicodeString& id, UBool visible, UErrorCode& status); 7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Register an ICUServiceFactory. Returns a registry key that 7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * can be used to unregister the factory. The factory 7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * must not be modified subsequent to this call. The service owns 7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * all registered factories. In case of an error, the factory is 7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * deleted.</p> 7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>This issues a serviceChanged notification to registered listeners.</p> 8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The default implementation accepts all factories.</p> 8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param factoryToAdopt the factory to register and adopt. 8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return a registry key that can be passed to unregister to unregister 8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (and discard) this factory. 8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual URegistryKey registerFactory(ICUServiceFactory* factoryToAdopt, UErrorCode& status); 8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Unregister a factory using a registry key returned by 8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * registerInstance or registerFactory. After a successful call, 8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the factory will be removed from the service factory list and 8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * deleted, and the key becomes invalid.</p> 8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>This issues a serviceChanged notification to registered 8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * listeners.</p> 8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param rkey the registry key. 8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if the call successfully unregistered the factory. 8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UBool unregister(URegistryKey rkey, UErrorCode& status); 8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * </p>Reset the service to the default factories. The factory 8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * lock is acquired and then reInitializeFactories is called.</p> 8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>This issues a serviceChanged notification to registered listeners.</p> 8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void reset(void); 8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Return TRUE if the service is in its default state.</p> 8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The default implementation returns TRUE if there are no 8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * factories registered.</p> 8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UBool isDefault(void) const; 8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Create a key from an ID. If ID is NULL, returns NULL.</p> 8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The default implementation creates an ICUServiceKey instance. 8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Subclasses can override to define more useful keys appropriate 8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * to the factories they accept.</p> 8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param a pointer to the ID for which to create a default ICUServiceKey. 8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the ICUServiceKey corresponding to ID, or NULL. 8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ICUServiceKey* createKey(const UnicodeString* id, UErrorCode& status) const; 8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Clone object so that caller can own the copy. In ICU2.4, UObject doesn't define 8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * clone, so we need an instance-aware method that knows how to do this. 8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This is public so factories can call it, but should really be protected.</p> 8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param instance the service instance to clone. 8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return a clone of the passed-in instance, or NULL if cloning was unsuccessful. 8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UObject* cloneInstance(UObject* instance) const = 0; 8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /************************************************************************ 8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Subclassing API 8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org protected: 8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Create a factory that wraps a single service object. Called by registerInstance.</p> 8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The default implementation returns an instance of SimpleFactory.</p> 8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param instanceToAdopt the service instance to adopt. 8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param id the ID to assign to this service instance. 8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param visible if TRUE, the ID will be visible. 8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return an instance of ICUServiceFactory that maps this instance to the provided ID. 8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ICUServiceFactory* createSimpleFactory(UObject* instanceToAdopt, const UnicodeString& id, UBool visible, UErrorCode& status); 8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Reinitialize the factory list to its default state. After this call, isDefault() 8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * must return TRUE.</p> 8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>This issues a serviceChanged notification to registered listeners.</p> 8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The default implementation clears the factory list. 8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Subclasses can override to provide other default initialization 8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * of the factory list. Subclasses must not call this method 8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * directly, since it must only be called while holding write 8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * access to the factory list.</p> 8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void reInitializeFactories(void); 8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Default handler for this service if no factory in the factory list 9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * handled the key passed to getKey.</p> 9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The default implementation returns NULL.</p> 9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param key the key. 9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param actualReturn a pointer to a UnicodeString to hold the matched descriptor, or NULL. 9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the service instance, or NULL. 9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UObject* handleDefault(const ICUServiceKey& key, UnicodeString* actualReturn, UErrorCode& status) const; 9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Clear caches maintained by this service.</p> 9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Subclasses can override if they implement additional caches 9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * that need to be cleared when the service changes. Subclasses 9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * should generally not call this method directly, as it must only 9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * be called while synchronized on the factory lock.</p> 9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void clearCaches(void); 9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Return true if the listener is accepted.</p> 9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The default implementation accepts the listener if it is 9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a ServiceListener. Subclasses can override this to accept 9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * different listeners.</p> 9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param l the listener to test. 9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if the service accepts the listener. 9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UBool acceptsListener(const EventListener& l) const; 9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Notify the listener of a service change.</p> 9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The default implementation assumes a ServiceListener. 9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If acceptsListener has been overridden to accept different 9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * listeners, this should be overridden as well.</p> 9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param l the listener to notify. 9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void notifyListener(EventListener& l) const; 9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /************************************************************************ 9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Utilities for subclasses. 9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Clear only the service cache.</p> 9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>This can be called by subclasses when a change affects the service 9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * cache but not the ID caches, e.g., when the default locale changes 9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the resolution of IDs also changes, requiring the cache to be 9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * flushed, but not the visible IDs themselves.</p> 9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void clearServiceCache(void); 9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Return a map from visible IDs to factories. 9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This must only be called when the mutex is held.</p> 9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status the error code status. 9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return a Hashtable containing mappings from visible 9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * IDs to factories. 9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const Hashtable* getVisibleIDMap(UErrorCode& status) const; 9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Allow subclasses to read the time stamp.</p> 9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the timestamp. 9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t getTimestamp(void) const; 9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Return the number of registered factories.</p> 9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the number of factories registered at the time of the call. 9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t countFactories(void) const; 9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org friend class ::ICUServiceTest; // give tests access to countFactories. 9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END 9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* UCONFIG_NO_SERVICE */ 9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* ICUSERV_H */ 9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 995