| Index: net/ftp/ftp_util.cc
|
| diff --git a/net/ftp/ftp_util.cc b/net/ftp/ftp_util.cc
|
| index 2633e9d5dfa4d016c353d948101f3e8a53fd9388..6c7959f60f6af118cdfdd44a1c8e7948cc85f79e 100644
|
| --- a/net/ftp/ftp_util.cc
|
| +++ b/net/ftp/ftp_util.cc
|
| @@ -1,4 +1,4 @@
|
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| @@ -12,6 +12,8 @@
|
| #include "base/string_util.h"
|
| #include "base/time.h"
|
| #include "base/utf_string_conversions.h"
|
| +#include "unicode/datefmt.h"
|
| +#include "unicode/dtfmtsym.h"
|
|
|
| // For examples of Unix<->VMS path conversions, see the unit test file. On VMS
|
| // a path looks differently depending on whether it's a file or directory.
|
| @@ -108,41 +110,40 @@ std::string FtpUtil::VMSPathToUnix(const std::string& vms_path) {
|
| }
|
|
|
| // static
|
| -bool FtpUtil::ThreeLetterMonthToNumber(const string16& text, int* number) {
|
| - const static char* months[] = { "jan", "feb", "mar", "apr", "may", "jun",
|
| - "jul", "aug", "sep", "oct", "nov", "dec" };
|
| -
|
| - for (size_t i = 0; i < arraysize(months); i++) {
|
| - if (LowerCaseEqualsASCII(text, months[i])) {
|
| - *number = i + 1;
|
| - return true;
|
| +bool FtpUtil::AbbreviatedMonthToNumber(const string16& text, int* number) {
|
| + icu::UnicodeString unicode_text(text.data(), text.size());
|
| +
|
| + int32_t locales_count;
|
| + const icu::Locale* locales =
|
| + icu::DateFormat::getAvailableLocales(locales_count);
|
| +
|
| + // Some FTP servers localize the date listings. To guess the locale,
|
| + // we loop over all available ones.
|
| + for (int32_t locale = 0; locale < locales_count; locale++) {
|
| + UErrorCode status(U_ZERO_ERROR);
|
| +
|
| + icu::DateFormatSymbols format_symbols(locales[locale], status);
|
| +
|
| + // If we cannot get format symbols for some locale, it's not a fatal error.
|
| + // Just try another one.
|
| + if (U_FAILURE(status))
|
| + continue;
|
| +
|
| + int32_t months_count;
|
| + const icu::UnicodeString* months =
|
| + format_symbols.getShortMonths(months_count);
|
| +
|
| + // Loop over all abbreviated month names in given locale.
|
| + // An alternative solution (to parse |text| in given locale) is more
|
| + // lenient, and may accept more than we want even with setLenient(false).
|
| + for (int32_t month = 0; month < months_count; month++) {
|
| + if (months[month].caseCompare(unicode_text, 0) == 0) {
|
| + *number = month + 1;
|
| + return true;
|
| + }
|
| }
|
| }
|
|
|
| - // Special cases for directory listings in German (other three-letter month
|
| - // abbreviations are the same as in English). Note that we don't need to do
|
| - // a case-insensitive compare here. Only "ls -l" style listings may use
|
| - // localized month names, and they will always start capitalized. Also,
|
| - // converting non-ASCII characters to lowercase would be more complicated.
|
| - if (text == UTF8ToUTF16("M\xc3\xa4r")) {
|
| - // The full month name is M-(a-umlaut)-rz (March), which is M-(a-umlaut)r
|
| - // when abbreviated.
|
| - *number = 3;
|
| - return true;
|
| - }
|
| - if (text == ASCIIToUTF16("Mai")) {
|
| - *number = 5;
|
| - return true;
|
| - }
|
| - if (text == ASCIIToUTF16("Okt")) {
|
| - *number = 10;
|
| - return true;
|
| - }
|
| - if (text == ASCIIToUTF16("Dez")) {
|
| - *number = 12;
|
| - return true;
|
| - }
|
| -
|
| return false;
|
| }
|
|
|
| @@ -153,7 +154,7 @@ bool FtpUtil::LsDateListingToTime(const string16& month, const string16& day,
|
| base::Time* result) {
|
| base::Time::Exploded time_exploded = { 0 };
|
|
|
| - if (!ThreeLetterMonthToNumber(month, &time_exploded.month))
|
| + if (!AbbreviatedMonthToNumber(month, &time_exploded.month))
|
| return false;
|
|
|
| if (!base::StringToInt(day, &time_exploded.day_of_month))
|
|
|