diff --git a/icu4c/source/i18n/unicode/calendar.h b/icu4c/source/i18n/unicode/calendar.h
index fe3fd83e70..02a389cc53 100644
--- a/icu4c/source/i18n/unicode/calendar.h
+++ b/icu4c/source/i18n/unicode/calendar.h
@@ -35,6 +35,13 @@
U_NAMESPACE_BEGIN
+class ICUServiceFactory;
+
+/**
+ * @draft ICU 2.6
+ */
+typedef const void* URegistryKey;
+
/**
* Calendar
is an abstract base class for converting between
* a UDate
object and a set of integer fields such as
@@ -245,7 +252,8 @@ public:
*
* @param success Indicates the success/failure of Calendar creation. Filled in
* with U_ZERO_ERROR if created successfully, set to a failure result
- * otherwise.
+ * otherwise. U_MISSING_RESOURCE_ERROR will be returned if the resource data
+ * requests a calendar type which has not been installed.
* @return A Calendar if created successfully. NULL otherwise.
* @stable ICU 2.0
*/
@@ -325,7 +333,7 @@ public:
* @param count Number of locales returned.
* @return An array of Locale objects representing the set of locales for which
* Calendars are installed. The system retains ownership of this list;
- * the caller must NOT delete it.
+ * the caller must NOT delete it. Does not include user-registered Calendars.
* @stable ICU 2.0
*/
static const Locale* getAvailableLocales(int32_t& count);
@@ -1403,6 +1411,60 @@ private:
* The resource tag for the resource where the week-count data is stored.
*/
static const char kDateTimeElements[];
+
+ /**
+ * The resource tag where the default calendar is stored.
+ */
+ static const char kDefaultCalendar[];
+
+ /**
+ * INTERNAL FOR 2.6 -- Registration.
+ */
+ public:
+ /**
+ * Returns the resource key string used for this calendar type.
+ * For example, prepending "Eras_" to this string could return "Eras_japanese"
+ * or "Eras_gregorian".
+ *
+ * @returns static string, for example, "gregorian" or "japanese"
+ * @internal
+ */
+ virtual const char * getType() const = 0;
+
+
+ /**
+ * Return a StringEnumeration over the locales available at the time of the call,
+ * including registered locales.
+ * @return a StringEnumeration over the locales available at the time of the call
+ * @internal
+ */
+ static StringEnumeration* getAvailableLocales(void);
+
+ /**
+ * Register a new Calendar factory. The factory will be adopted.
+ * INTERNAL in 2.6
+ * @param toAdopt the factory instance to be adopted
+ * @param status the in/out status code, no special meanings are assigned
+ * @return a registry key that can be used to unregister this factory
+ * @internal
+ */
+ static URegistryKey registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status);
+
+ /**
+ * Unregister a previously-registered CalendarFactory using the key returned from the
+ * register call. Key becomes invalid after a successful call and should not be used again.
+ * The CalendarFactory corresponding to the key will be deleted.
+ * INTERNAL in 2.6
+ * @param key the registry key returned by a previous call to registerFactory
+ * @param status the in/out status code, no special meanings are assigned
+ * @return TRUE if the factory for the key was successfully unregistered
+ * @internal
+ */
+ static UBool unregister(URegistryKey key, UErrorCode& status);
+
+ friend class CalendarFactory;
+ friend class CalendarService;
+ friend class DefaultCalendarFactory;
};
// -------------------------------------
diff --git a/icu4c/source/i18n/unicode/dtfmtsym.h b/icu4c/source/i18n/unicode/dtfmtsym.h
index 5d420bb5c9..7266c02fad 100644
--- a/icu4c/source/i18n/unicode/dtfmtsym.h
+++ b/icu4c/source/i18n/unicode/dtfmtsym.h
@@ -65,7 +65,7 @@ class U_I18N_API DateFormatSymbols : public UObject {
public:
/**
* Construct a DateFormatSymbols object by loading format data from
- * resources for the default locale.
+ * resources for the default locale, in the default calendar (Gregorian).
*
* NOTE: This constructor will never fail; if it cannot get resource * data for the default locale, it will return a last-resort object @@ -80,7 +80,7 @@ public: /** * Construct a DateFormatSymbols object by loading format data from - * resources for the given locale. + * resources for the given locale, in the default calendar (Gregorian). * * @param locale Locale to load format data from. * @param status Output param set to success of failure. Failure @@ -91,6 +91,41 @@ public: DateFormatSymbols(const Locale& locale, UErrorCode& status); + /** + * Construct a DateFormatSymbols object by loading format data from + * resources for the default locale, in the default calendar (Gregorian). + *
+ * NOTE: This constructor will never fail; if it cannot get resource + * data for the default locale, it will return a last-resort object + * based on hard-coded strings. + * + * @param type Type of calendar (as returned by Calendar::getType). + * Will be used to access the correct set of strings. + * (NULL or empty string defaults to "gregorian".) + * @param status Output param set to success of failure. Failure + * results if the resources for the default cannot be + * found or cannot be loaded + * @draft ICU 2.6 + */ + DateFormatSymbols(const char *type, UErrorCode& status); + + /** + * Construct a DateFormatSymbols object by loading format data from + * resources for the given locale, in the default calendar (Gregorian). + * + * @param locale Locale to load format data from. + * @param type Type of calendar (as returned by Calendar::getType). + * Will be used to access the correct set of strings. + * (NULL or empty string defaults to "gregorian".) + * @param status Output param set to success of failure. Failure + * results if the resources for the locale cannot be + * found or cannot be loaded + * @draft ICU 2.6 + */ + DateFormatSymbols(const Locale& locale, + const char *type, + UErrorCode& status); + /** * Copy constructor. * @stable ICU 2.0 @@ -378,15 +413,29 @@ private: void initField(UnicodeString **field, int32_t& length, const ResourceBundle data, UErrorCode &status); void initField(UnicodeString **field, int32_t& length, const UChar *data, LastResortSize numStr, LastResortSize strLen, UErrorCode &status); + /** + * Load data for specified 'type', falling back to gregorian if needed + * + * @param rb ResourceBundle + * @param tag Resource key to data + * @param type Calendar type + * @param status Error Status + * @internal + */ + ResourceBundle + getData(ResourceBundle &rb, const char *tag, const char *type, UErrorCode& status); + + /** * Called by the constructors to actually load data from the resources * * @param locale The locale to get symbols for. + * @param type Calendar Type (as from Calendar::getType()) * @param status Input/output parameter, set to success or * failure code upon return. * @param useLastResortData determine if use last resort data */ - void initializeData(const Locale&, UErrorCode& status, UBool useLastResortData = FALSE); + void initializeData(const Locale&, const char *type, UErrorCode& status, UBool useLastResortData = FALSE); /** * Copy or alias an array in another object, as appropriate. diff --git a/icu4c/source/i18n/unicode/gregocal.h b/icu4c/source/i18n/unicode/gregocal.h index 451652d191..e27eccaf74 100644 --- a/icu4c/source/i18n/unicode/gregocal.h +++ b/icu4c/source/i18n/unicode/gregocal.h @@ -546,8 +546,22 @@ public: */ static inline UClassID getStaticClassID(void); + /** + * return the calendar type, "gregorian". + * + * @return calendar type + * @internal + */ + virtual const char * getType() const; + protected: + /*** + * Called by computeFields. Converts calendar's year into Gregorian Extended Year (where negative = BC) + * @internal + */ + //virtual int32_t getGregorianYear(UErrorCode &status); + /** * (Overrides Calendar) Converts GMT as milliseconds to time field values. * @param status Fill-in parameter which receives the status of this operation. @@ -569,19 +583,20 @@ protected: private: GregorianCalendar(); // default constructor not implemented + protected: /** * Return the ERA. We need a special method for this because the * default ERA is AD, but a zero (unset) ERA is BC. * @return the ERA. */ - int32_t internalGetEra() const; + virtual int32_t internalGetEra() const; /** * return the length of the given month. * @param month the given month. * @return the length of the given month. */ - int32_t monthLength(int32_t month) const; + virtual int32_t monthLength(int32_t month) const; /** * return the length of the month according to the given year. @@ -589,7 +604,7 @@ private: * @param year the given year. * @return the length of the month */ - int32_t monthLength(int32_t month, int32_t year) const; + virtual int32_t monthLength(int32_t month, int32_t year) const; /** * return the length of the given year. @@ -618,8 +633,8 @@ private: * @param status Fill-in parameter which receives the status of this operation. * @return the day number with respect to the epoch. */ - UDate getEpochDay(UErrorCode& status); - + virtual UDate getEpochDay(UErrorCode& status); + private: /** * Compute the julian day number of the given year. * @param isGregorian if true, using Gregorian calendar, otherwise using Julian calendar