Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(953)

Side by Side Diff: base/i18n/time_formatting.cc

Issue 2745233002: base: Make TimeDurationFormat* report failures. (Closed)
Patch Set: merge Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/i18n/time_formatting.h ('k') | base/i18n/time_formatting_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/i18n/time_formatting.h" 5 #include "base/i18n/time_formatting.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
13 #include "base/time/time.h" 13 #include "base/time/time.h"
14 #include "third_party/icu/source/common/unicode/utypes.h"
14 #include "third_party/icu/source/i18n/unicode/datefmt.h" 15 #include "third_party/icu/source/i18n/unicode/datefmt.h"
15 #include "third_party/icu/source/i18n/unicode/dtptngen.h" 16 #include "third_party/icu/source/i18n/unicode/dtptngen.h"
16 #include "third_party/icu/source/i18n/unicode/fmtable.h" 17 #include "third_party/icu/source/i18n/unicode/fmtable.h"
17 #include "third_party/icu/source/i18n/unicode/measfmt.h" 18 #include "third_party/icu/source/i18n/unicode/measfmt.h"
18 #include "third_party/icu/source/i18n/unicode/smpdtfmt.h" 19 #include "third_party/icu/source/i18n/unicode/smpdtfmt.h"
19 20
20 namespace base { 21 namespace base {
21 namespace { 22 namespace {
22 23
23 string16 TimeFormat(const icu::DateFormat* formatter, 24 string16 TimeFormat(const icu::DateFormat* formatter,
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 icu::DateFormat::createDateTimeInstance(icu::DateFormat::kFull)); 147 icu::DateFormat::createDateTimeInstance(icu::DateFormat::kFull));
147 return TimeFormat(formatter.get(), time); 148 return TimeFormat(formatter.get(), time);
148 } 149 }
149 150
150 string16 TimeFormatFriendlyDate(const Time& time) { 151 string16 TimeFormatFriendlyDate(const Time& time) {
151 std::unique_ptr<icu::DateFormat> formatter( 152 std::unique_ptr<icu::DateFormat> formatter(
152 icu::DateFormat::createDateInstance(icu::DateFormat::kFull)); 153 icu::DateFormat::createDateInstance(icu::DateFormat::kFull));
153 return TimeFormat(formatter.get(), time); 154 return TimeFormat(formatter.get(), time);
154 } 155 }
155 156
156 string16 TimeDurationFormat(const TimeDelta time, 157 bool TimeDurationFormat(const TimeDelta time,
157 const DurationFormatWidth width) { 158 const DurationFormatWidth width,
159 string16* out) {
160 DCHECK(out);
158 UErrorCode status = U_ZERO_ERROR; 161 UErrorCode status = U_ZERO_ERROR;
159 const int total_minutes = static_cast<int>(time.InSecondsF() / 60 + 0.5); 162 const int total_minutes = static_cast<int>(time.InSecondsF() / 60 + 0.5);
160 const int hours = total_minutes / 60; 163 const int hours = total_minutes / 60;
161 const int minutes = total_minutes % 60; 164 const int minutes = total_minutes % 60;
162 UMeasureFormatWidth u_width = DurationWidthToMeasureWidth(width); 165 UMeasureFormatWidth u_width = DurationWidthToMeasureWidth(width);
163 166
167 // TODO(derat): Delete the |status| checks and LOG(ERROR) calls throughout
168 // this function once the cause of http://crbug.com/677043 is tracked down.
164 const icu::Measure measures[] = { 169 const icu::Measure measures[] = {
165 icu::Measure(hours, icu::MeasureUnit::createHour(status), status), 170 icu::Measure(hours, icu::MeasureUnit::createHour(status), status),
166 icu::Measure(minutes, icu::MeasureUnit::createMinute(status), status)}; 171 icu::Measure(minutes, icu::MeasureUnit::createMinute(status), status)};
172 if (U_FAILURE(status)) {
173 LOG(ERROR) << "Creating MeasureUnit or Measure for " << hours << "h"
174 << minutes << "m failed: " << u_errorName(status);
175 return false;
176 }
177
167 icu::MeasureFormat measure_format(icu::Locale::getDefault(), u_width, status); 178 icu::MeasureFormat measure_format(icu::Locale::getDefault(), u_width, status);
179 if (U_FAILURE(status)) {
180 LOG(ERROR) << "Creating MeasureFormat for "
181 << icu::Locale::getDefault().getName()
182 << " failed: " << u_errorName(status);
183 return false;
184 }
185
168 icu::UnicodeString formatted; 186 icu::UnicodeString formatted;
169 icu::FieldPosition ignore(icu::FieldPosition::DONT_CARE); 187 icu::FieldPosition ignore(icu::FieldPosition::DONT_CARE);
170 measure_format.formatMeasures(measures, 2, formatted, ignore, status); 188 measure_format.formatMeasures(measures, 2, formatted, ignore, status);
171 return base::string16(formatted.getBuffer(), formatted.length()); 189 if (U_FAILURE(status)) {
190 LOG(ERROR) << "formatMeasures failed: " << u_errorName(status);
191 return false;
192 }
193
194 *out = base::string16(formatted.getBuffer(), formatted.length());
195 return true;
172 } 196 }
173 197
174 string16 TimeDurationFormatWithSeconds(const TimeDelta time, 198 bool TimeDurationFormatWithSeconds(const TimeDelta time,
175 const DurationFormatWidth width) { 199 const DurationFormatWidth width,
200 string16* out) {
201 DCHECK(out);
176 UErrorCode status = U_ZERO_ERROR; 202 UErrorCode status = U_ZERO_ERROR;
177 const int64_t total_seconds = static_cast<int>(time.InSecondsF() + 0.5); 203 const int64_t total_seconds = static_cast<int>(time.InSecondsF() + 0.5);
178 const int hours = total_seconds / 3600; 204 const int hours = total_seconds / 3600;
179 const int minutes = (total_seconds - hours * 3600) / 60; 205 const int minutes = (total_seconds - hours * 3600) / 60;
180 const int seconds = total_seconds % 60; 206 const int seconds = total_seconds % 60;
181 UMeasureFormatWidth u_width = DurationWidthToMeasureWidth(width); 207 UMeasureFormatWidth u_width = DurationWidthToMeasureWidth(width);
182 208
183 const icu::Measure measures[] = { 209 const icu::Measure measures[] = {
184 icu::Measure(hours, icu::MeasureUnit::createHour(status), status), 210 icu::Measure(hours, icu::MeasureUnit::createHour(status), status),
185 icu::Measure(minutes, icu::MeasureUnit::createMinute(status), status), 211 icu::Measure(minutes, icu::MeasureUnit::createMinute(status), status),
186 icu::Measure(seconds, icu::MeasureUnit::createSecond(status), status)}; 212 icu::Measure(seconds, icu::MeasureUnit::createSecond(status), status)};
187 icu::MeasureFormat measure_format(icu::Locale::getDefault(), u_width, status); 213 icu::MeasureFormat measure_format(icu::Locale::getDefault(), u_width, status);
188 icu::UnicodeString formatted; 214 icu::UnicodeString formatted;
189 icu::FieldPosition ignore(icu::FieldPosition::DONT_CARE); 215 icu::FieldPosition ignore(icu::FieldPosition::DONT_CARE);
190 measure_format.formatMeasures(measures, 3, formatted, ignore, status); 216 measure_format.formatMeasures(measures, 3, formatted, ignore, status);
191 return base::string16(formatted.getBuffer(), formatted.length()); 217 *out = base::string16(formatted.getBuffer(), formatted.length());
218 return U_SUCCESS(status) == TRUE;
192 } 219 }
193 220
194 HourClockType GetHourClockType() { 221 HourClockType GetHourClockType() {
195 // TODO(satorux,jshin): Rework this with ures_getByKeyWithFallback() 222 // TODO(satorux,jshin): Rework this with ures_getByKeyWithFallback()
196 // once it becomes public. The short time format can be found at 223 // once it becomes public. The short time format can be found at
197 // "calendar/gregorian/DateTimePatterns/3" in the resources. 224 // "calendar/gregorian/DateTimePatterns/3" in the resources.
198 std::unique_ptr<icu::SimpleDateFormat> formatter( 225 std::unique_ptr<icu::SimpleDateFormat> formatter(
199 static_cast<icu::SimpleDateFormat*>( 226 static_cast<icu::SimpleDateFormat*>(
200 icu::DateFormat::createTimeInstance(icu::DateFormat::kShort))); 227 icu::DateFormat::createTimeInstance(icu::DateFormat::kShort)));
201 // Retrieve the short time format. 228 // Retrieve the short time format.
(...skipping 23 matching lines...) Expand all
225 // See http://userguide.icu-project.org/formatparse/datetime for details 252 // See http://userguide.icu-project.org/formatparse/datetime for details
226 // about the date/time format syntax. 253 // about the date/time format syntax.
227 if (pattern_unicode.indexOf('a') == -1) { 254 if (pattern_unicode.indexOf('a') == -1) {
228 return k24HourClock; 255 return k24HourClock;
229 } else { 256 } else {
230 return k12HourClock; 257 return k12HourClock;
231 } 258 }
232 } 259 }
233 260
234 } // namespace base 261 } // namespace base
OLDNEW
« no previous file with comments | « base/i18n/time_formatting.h ('k') | base/i18n/time_formatting_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698