virtual void put(const char *key, ResourceValue &value, UBool, UErrorCode &errorCode) { ResourceTable dayPeriodData = value.getTable(errorCode); if (U_FAILURE(errorCode)) { return; } for (int32_t i = 0; dayPeriodData.getKeyAndValue(i, key, value); ++i) { if (uprv_strcmp(key, "locales") == 0) { ResourceTable locales = value.getTable(errorCode); if (U_FAILURE(errorCode)) { return; } for (int32_t j = 0; locales.getKeyAndValue(j, key, value); ++j) { UnicodeString setNum_str = value.getUnicodeString(errorCode); int32_t setNum = parseSetNum(setNum_str, errorCode); uhash_puti(data->localeToRuleSetNumMap, const_cast<char *>(key), setNum, &errorCode); } } else if (uprv_strcmp(key, "rules") == 0) { // Allocate one more than needed to skip [0]. See comment in parseSetNum(). data->rules = new DayPeriodRules[data->maxRuleSetNum + 1]; if (data->rules == NULL) { errorCode = U_MEMORY_ALLOCATION_ERROR; return; } ResourceTable rules = value.getTable(errorCode); processRules(rules, key, value, errorCode); if (U_FAILURE(errorCode)) { return; } } } }
virtual void put(const char *key, const ResourceValue &value, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return; } UnicodeString setNum_str = value.getUnicodeString(errorCode); int32_t setNum = parseSetNum(setNum_str, errorCode); uhash_puti(data->localeToRuleSetNumMap, const_cast<char *>(key), setNum, &errorCode); }
void processRules(const ResourceTable &rules, const char *key, ResourceValue &value, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return; } for (int32_t i = 0; rules.getKeyAndValue(i, key, value); ++i) { ruleSetNum = parseSetNum(key, errorCode); ResourceTable ruleSet = value.getTable(errorCode); if (U_FAILURE(errorCode)) { return; } for (int32_t j = 0; ruleSet.getKeyAndValue(j, key, value); ++j) { period = DayPeriodRules::getDayPeriodFromString(key); if (period == DayPeriodRules::DAYPERIOD_UNKNOWN) { errorCode = U_INVALID_FORMAT_ERROR; return; } ResourceTable periodDefinition = value.getTable(errorCode); if (U_FAILURE(errorCode)) { return; } for (int32_t k = 0; periodDefinition.getKeyAndValue(k, key, value); ++k) { if (value.getType() == URES_STRING) { // Key-value pairs (e.g. before{6:00}). CutoffType type = getCutoffTypeFromString(key); addCutoff(type, value.getUnicodeString(errorCode), errorCode); if (U_FAILURE(errorCode)) { return; } } else { // Arrays (e.g. before{6:00, 24:00}). cutoffType = getCutoffTypeFromString(key); ResourceArray cutoffArray = value.getArray(errorCode); if (U_FAILURE(errorCode)) { return; } int32_t length = cutoffArray.getSize(); for (int32_t l = 0; l < length; ++l) { cutoffArray.getValue(l, value); addCutoff(cutoffType, value.getUnicodeString(errorCode), errorCode); if (U_FAILURE(errorCode)) { return; } } } } setDayPeriodForHoursFromCutoffs(errorCode); for (int32_t k = 0; k < UPRV_LENGTHOF(cutoffs); ++k) { cutoffs[k] = 0; } } if (!data->rules[ruleSetNum].allHoursAreSet()) { errorCode = U_INVALID_FORMAT_ERROR; return; } } }
// Helpers. static int32_t parseSetNum(const UnicodeString &setNumStr, UErrorCode &errorCode) { CharString cs; cs.appendInvariantChars(setNumStr, errorCode); return parseSetNum(cs.data(), errorCode); }
virtual ResourceTableSink *getOrCreateTableSink(const char *key, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return NULL; } outer.ruleSetNum = parseSetNum(key, errorCode); return &outer.ruleSetSink; }