status_t BTimeUnitFormat::Format(BString& buffer, const int32 value, const time_unit_element unit) const { if (unit < 0 || unit > B_TIME_UNIT_LAST) return B_BAD_VALUE; if (fFormatter == NULL) return B_NO_INIT; UErrorCode icuStatus = U_ZERO_ERROR; TimeUnitAmount* timeUnitAmount = new TimeUnitAmount((double)value, skUnitMap[unit], icuStatus); if (timeUnitAmount == NULL) return B_NO_MEMORY; if (!U_SUCCESS(icuStatus)) return B_ERROR; Formattable formattable; formattable.adoptObject(timeUnitAmount); FieldPosition pos(FieldPosition::DONT_CARE); UnicodeString unicodeResult; fFormatter->format(formattable, unicodeResult, pos, icuStatus); if (!U_SUCCESS(icuStatus)) return B_ERROR; BStringByteSink byteSink(&buffer); unicodeResult.toUTF8(byteSink); return B_OK; }
void MgResourceDataFileManager::SetResourceData(CREFSTRING pathname, MgByteReader* byteReader) { assert(NULL != byteReader); MG_RESOURCE_SERVICE_TRY() // Ensure the current operation is transactionally protected. m_repositoryMan.ValidateTransaction(); // TODO: Optimization - Back up the file if it exists? MgByteSink byteSink(byteReader); byteSink.ToFile(pathname); MG_RESOURCE_SERVICE_CATCH_AND_THROW(L"MgResourceDataFileManager.SetResourceData") }
status_t BMessageFormat::Format(BString& output, const int32 arg) const { if (fInitStatus != B_OK) return fInitStatus; UnicodeString buffer; UErrorCode error = U_ZERO_ERROR; Formattable arguments[] = { (int32_t)arg }; FieldPosition pos; buffer = fFormatter->format(arguments, 1, buffer, pos, error); if (!U_SUCCESS(error)) return B_ERROR; BStringByteSink byteSink(&output); buffer.toUTF8(byteSink); return B_OK; }
status_t ICUTimeConversion::TZSet(const char* timeZoneID, const char* tz) { bool offsetHasBeenSet = false; // The given TZ environment variable's content overrides the default // system timezone. if (tz != NULL) { // If the value given in the TZ env-var starts with a colon, that // value is implementation specific, we expect a full timezone ID. if (*tz == ':') { // nothing to do if the given name matches the current timezone if (strcasecmp(fTimeZoneID, tz + 1) == 0) return B_OK; strlcpy(fTimeZoneID, tz + 1, sizeof(fTimeZoneID)); } else { // note timezone name strlcpy(fTimeZoneID, tz, sizeof(fTimeZoneID)); // nothing to do if the given name matches the current timezone if (strcasecmp(fTimeZoneID, fDataBridge->addrOfTZName[0]) == 0) return B_OK; // parse TZ variable (only <std> and <offset> supported) const char* tzNameEnd = tz; while(isalpha(*tzNameEnd)) ++tzNameEnd; if (*tzNameEnd == '-' || *tzNameEnd == '+') { int hours = 0; int minutes = 0; int seconds = 0; sscanf(tzNameEnd + 1, "%2d:%2d:%2d", &hours, &minutes, &seconds); hours = min_c(24, max_c(0, hours)); minutes = min_c(59, max_c(0, minutes)); seconds = min_c(59, max_c(0, seconds)); *fDataBridge->addrOfTimezone = (*tzNameEnd == '-' ? -1 : 1) * (hours * 3600 + minutes * 60 + seconds); offsetHasBeenSet = true; } } } else { // nothing to do if the given name matches the current timezone if (strcasecmp(fTimeZoneID, timeZoneID) == 0) return B_OK; strlcpy(fTimeZoneID, timeZoneID, sizeof(fTimeZoneID)); } delete fTimeZone; fTimeZone = TimeZone::createTimeZone(fTimeZoneID); if (fTimeZone == NULL) return B_NO_MEMORY; if (offsetHasBeenSet) { fTimeZone->setRawOffset(*fDataBridge->addrOfTimezone * -1 * 1000); } else { int32_t rawOffset; int32_t dstOffset; UDate nowMillis = 1000 * (UDate)time(NULL); UErrorCode icuStatus = U_ZERO_ERROR; fTimeZone->getOffset(nowMillis, FALSE, rawOffset, dstOffset, icuStatus); if (!U_SUCCESS(icuStatus)) { *fDataBridge->addrOfTimezone = 0; *fDataBridge->addrOfDaylight = false; strcpy(fDataBridge->addrOfTZName[0], "GMT"); strcpy(fDataBridge->addrOfTZName[1], "GMT"); return B_ERROR; } *fDataBridge->addrOfTimezone = -1 * (rawOffset + dstOffset) / 1000; // we want seconds, not the ms that ICU gives us } *fDataBridge->addrOfDaylight = fTimeZone->useDaylightTime(); for (int i = 0; i < 2; ++i) { if (tz != NULL && *tz != ':' && i == 0) { strcpy(fDataBridge->addrOfTZName[0], fTimeZoneID); } else { UnicodeString icuString; fTimeZone->getDisplayName(i == 1, TimeZone::SHORT, fTimeData.ICULocaleForStrings(), icuString); CheckedArrayByteSink byteSink(fDataBridge->addrOfTZName[i], sizeof(fTimeZoneID)); icuString.toUTF8(byteSink); // make sure to canonicalize "GMT+00:00" to just "GMT" if (strcmp(fDataBridge->addrOfTZName[i], "GMT+00:00") == 0) fDataBridge->addrOfTZName[i][3] = '\0'; } } return B_OK; }