in CoreFoundation/Locale.subproj/CFDateFormatter.c [1839:2049]
static void __CFDateFormatterSetProperty(CFDateFormatterRef formatter, CFStringRef key, CFTypeRef value, Boolean directToICU) {
__CFGenericValidateType(formatter, CFDateFormatterGetTypeID());
__CFGenericValidateType(key, CFStringGetTypeID());
CFTypeRef oldProperty = NULL;
UErrorCode status = U_ZERO_ERROR;
if (kCFDateFormatterIsLenientKey == key) {
if (!directToICU) {
oldProperty = formatter->_property. _IsLenient;
formatter->_property. _IsLenient = NULL;
}
__CFGenericValidateType(value, CFBooleanGetTypeID());
if (!directToICU) {
formatter->_property. _IsLenient = value ? (CFBooleanRef)CFRetain(value) : NULL;
__ResetUDateFormat(formatter, false);
}
} else if (kCFDateFormatterDoesRelativeDateFormattingKey == key) {
if (!directToICU) {
oldProperty = formatter->_property. _DoesRelativeDateFormatting;
formatter->_property. _DoesRelativeDateFormatting = NULL;
}
__CFGenericValidateType(value, CFBooleanGetTypeID());
if (!directToICU) {
if (kCFBooleanTrue != value) value = kCFBooleanFalse;
formatter->_property. _DoesRelativeDateFormatting = value ? (CFBooleanRef)CFRetain(value) : NULL;
__ResetUDateFormat(formatter, false);
}
} else if (kCFDateFormatterCalendarKey == key) {
if (!directToICU) {
oldProperty = formatter->_property. _Calendar;
formatter->_property. _Calendar = NULL;
}
__CFGenericValidateType(value, CFCalendarGetTypeID());
CFLocaleRef newLocale = _CFLocaleCreateCopyWithNewCalendarIdentifier(CFGetAllocator(formatter->_locale), formatter->_locale, CFCalendarGetIdentifier((CFCalendarRef)value));
if (formatter->_locale) {
CFRelease(formatter->_locale);
}
// at this point, we should be setting the preferences if any into this new locale
formatter->_locale = newLocale;
if (!directToICU) {
formatter->_property. _Calendar = (CFCalendarRef)CFDateFormatterCopyProperty(formatter, kCFDateFormatterCalendarKey);
__ResetUDateFormat(formatter, false);
}
} else if (kCFDateFormatterCalendarIdentifierKey == key) {
if (!directToICU) {
oldProperty = formatter->_property. _CalendarName;
formatter->_property. _CalendarName = NULL;
}
__CFGenericValidateType(value, CFStringGetTypeID());
CFStringRef localeName = CFLocaleGetIdentifier(formatter->_locale);
CFDictionaryRef components = CFLocaleCreateComponentsFromLocaleIdentifier(kCFAllocatorSystemDefault, localeName);
CFMutableDictionaryRef mcomponents = CFDictionaryCreateMutableCopy(kCFAllocatorSystemDefault, 0, components);
CFDictionarySetValue(mcomponents, kCFLocaleCalendarIdentifierKey, value);
localeName = CFLocaleCreateLocaleIdentifierFromComponents(kCFAllocatorSystemDefault, mcomponents);
CFRelease(mcomponents);
CFRelease(components);
CFLocaleRef newLocale = CFLocaleCreate(CFGetAllocator(formatter->_locale), localeName);
// at this point, we should be setting the preferences if any into this new locale
CFRelease(localeName);
CFRelease(formatter->_locale);
formatter->_locale = newLocale;
if (!directToICU) {
formatter->_property. _CalendarName = (CFStringRef)CFDateFormatterCopyProperty(formatter, kCFDateFormatterCalendarIdentifierKey);
__ResetUDateFormat(formatter, false);
}
} else if (kCFDateFormatterTimeZoneKey == key) {
if (formatter->_property. _TimeZone != value) {
if (!directToICU) {
oldProperty = formatter->_property. _TimeZone;
formatter->_property. _TimeZone = NULL;
}
__CFGenericValidateType(value, CFTimeZoneGetTypeID());
CFTimeZoneRef old = formatter->_property._TimeZone;
formatter->_property._TimeZone = value ? (CFTimeZoneRef)CFRetain(value) : CFTimeZoneCopyDefault();
if (old) CFRelease(old);
if (!directToICU) {
old = formatter->_property._TimeZone;
formatter->_property. _TimeZone = (CFTimeZoneRef)CFDateFormatterCopyProperty(formatter, kCFDateFormatterTimeZoneKey);
__ResetUDateFormat(formatter, false);
if (old) CFRelease(old);
}
}
} else if (kCFDateFormatterDefaultFormatKey == key) {
// read-only attribute
} else if (kCFDateFormatterTwoDigitStartDateKey == key) {
if (!directToICU) {
oldProperty = formatter->_property. _TwoDigitStartDate;
formatter->_property. _TwoDigitStartDate = NULL;
}
__CFGenericValidateType(value, CFDateGetTypeID());
if (!directToICU) {
formatter->_property. _TwoDigitStartDate = value ? (CFDateRef)CFRetain(value) : NULL;
}
} else if (kCFDateFormatterDefaultDateKey == key) {
if (!directToICU) {
oldProperty = formatter->_property. _DefaultDate;
formatter->_property. _DefaultDate = NULL;
}
__CFGenericValidateType(value, CFDateGetTypeID());
if (!directToICU) {
formatter->_property._DefaultDate = value ? (CFDateRef)CFRetain(value) : NULL;
}
} else if (kCFDateFormatterGregorianStartDateKey == key) {
if (!directToICU) {
oldProperty = formatter->_property. _GregorianStartDate;
formatter->_property. _GregorianStartDate = NULL;
}
__CFGenericValidateType(value, CFDateGetTypeID());
if (!directToICU) {
formatter->_property. _GregorianStartDate = value ? (CFDateRef)CFRetain(value) : NULL;
__ResetUDateFormat(formatter, false);
}
} else if (kCFDateFormatterEraSymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_ERAS, 0, _EraSymbols)
} else if (kCFDateFormatterLongEraSymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_ERA_NAMES, 0, _LongEraSymbols)
} else if (kCFDateFormatterMonthSymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_MONTHS, 0, _MonthSymbols)
} else if (kCFDateFormatterShortMonthSymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_SHORT_MONTHS, 0, _ShortMonthSymbols)
} else if (kCFDateFormatterVeryShortMonthSymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_NARROW_MONTHS, 0, _VeryShortMonthSymbols)
} else if (kCFDateFormatterStandaloneMonthSymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_STANDALONE_MONTHS, 0, _StandaloneMonthSymbols)
} else if (kCFDateFormatterShortStandaloneMonthSymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_STANDALONE_SHORT_MONTHS, 0, _ShortStandaloneMonthSymbols)
} else if (kCFDateFormatterVeryShortStandaloneMonthSymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_STANDALONE_NARROW_MONTHS, 0, _VeryShortStandaloneMonthSymbols)
} else if (kCFDateFormatterWeekdaySymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_WEEKDAYS, 1, _WeekdaySymbols)
} else if (kCFDateFormatterShortWeekdaySymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_SHORT_WEEKDAYS, 1, _ShortWeekdaySymbols)
} else if (kCFDateFormatterVeryShortWeekdaySymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_NARROW_WEEKDAYS, 1, _VeryShortWeekdaySymbols)
} else if (kCFDateFormatterStandaloneWeekdaySymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_STANDALONE_WEEKDAYS, 1, _StandaloneWeekdaySymbols)
} else if (kCFDateFormatterShortStandaloneWeekdaySymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_STANDALONE_SHORT_WEEKDAYS, 1, _ShortStandaloneWeekdaySymbols)
} else if (kCFDateFormatterVeryShortStandaloneWeekdaySymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_STANDALONE_NARROW_WEEKDAYS, 1, _VeryShortStandaloneWeekdaySymbols)
} else if (kCFDateFormatterQuarterSymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_QUARTERS, 0, _QuarterSymbols)
} else if (kCFDateFormatterShortQuarterSymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_SHORT_QUARTERS, 0, _ShortQuarterSymbols)
} else if (kCFDateFormatterStandaloneQuarterSymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_STANDALONE_QUARTERS, 0, _StandaloneQuarterSymbols)
} else if (kCFDateFormatterShortStandaloneQuarterSymbolsKey == key) {
SET_SYMBOLS_ARRAY(UDAT_STANDALONE_SHORT_QUARTERS, 0, _ShortStandaloneQuarterSymbols)
} else if (kCFDateFormatterAMSymbolKey == key) {
if (!directToICU) {
oldProperty = formatter->_property. _AMSymbol;
formatter->_property. _AMSymbol = NULL;
}
__CFGenericValidateType(value, CFStringGetTypeID());
CFIndex item_cnt = CFStringGetLength((CFStringRef)value);
STACK_BUFFER_DECL(UChar, item_buffer, __CFMin(BUFFER_SIZE, item_cnt));
UChar *item_ustr = (UChar *)CFStringGetCharactersPtr((CFStringRef)value);
if (NULL == item_ustr) {
item_cnt = __CFMin(BUFFER_SIZE, item_cnt);
CFStringGetCharacters((CFStringRef)value, CFRangeMake(0, item_cnt), (UniChar *)item_buffer);
item_ustr = item_buffer;
}
__cficu_udat_setSymbols(formatter->_df, UDAT_AM_PMS, 0, item_ustr, item_cnt, &status);
if (!directToICU) {
formatter->_property. _AMSymbol = value ? (CFStringRef)CFStringCreateCopy(NULL, value) : NULL;
}
} else if (kCFDateFormatterPMSymbolKey == key) {
if (!directToICU) {
oldProperty = formatter->_property. _PMSymbol;
formatter->_property. _PMSymbol = NULL;
}
__CFGenericValidateType(value, CFStringGetTypeID());
CFIndex item_cnt = CFStringGetLength((CFStringRef)value);
STACK_BUFFER_DECL(UChar, item_buffer, __CFMin(BUFFER_SIZE, item_cnt));
UChar *item_ustr = (UChar *)CFStringGetCharactersPtr((CFStringRef)value);
if (NULL == item_ustr) {
item_cnt = __CFMin(BUFFER_SIZE, item_cnt);
CFStringGetCharacters((CFStringRef)value, CFRangeMake(0, item_cnt), (UniChar *)item_buffer);
item_ustr = item_buffer;
}
__cficu_udat_setSymbols(formatter->_df, UDAT_AM_PMS, 1, item_ustr, item_cnt, &status);
if (!directToICU) {
formatter->_property. _PMSymbol = value ? (CFStringRef)CFStringCreateCopy(NULL, value) : NULL;
}
} else if (kCFDateFormatterAmbiguousYearStrategyKey == key) {
oldProperty = formatter->_property._AmbiguousYearStrategy;
formatter->_property._AmbiguousYearStrategy = NULL;
__CFGenericValidateType(value, CFNumberGetTypeID());
formatter->_property._AmbiguousYearStrategy = (CFNumberRef)CFRetain(value);
} else if (kCFDateFormatterUsesCharacterDirectionKey == key) {
__CFGenericValidateType(value, CFBooleanGetTypeID());
oldProperty = formatter->_property._UsesCharacterDirection;
formatter->_property._UsesCharacterDirection = (CFBooleanRef)CFRetain(value);
} else if (CFEqual(key, kCFDateFormatterFormattingContextKey)) {
if (!directToICU) {
oldProperty = formatter->_property. _FormattingContext;
formatter->_property._FormattingContext = NULL;
}
__CFGenericValidateType(value, CFNumberGetTypeID());
int context = 0;
CFNumberGetValue(value, kCFNumberIntType, &context);
__cficu_udat_setContext(formatter->_df, context, &status);
if (!directToICU) {
formatter->_property._FormattingContext = (CFNumberRef)CFRetain(value);
}
} else {
CFAssert3(0, __kCFLogAssertion, "%s(): unknown key %p (%@)", __PRETTY_FUNCTION__, key, key);
}
if (oldProperty) CFRelease(oldProperty);
}