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

Unified Diff: net/ftp/ftp_util.cc

Issue 6697021: FTP: use ICU to parse month abbreviations. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed the comments Created 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/ftp/ftp_util.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/ftp/ftp_util.cc
diff --git a/net/ftp/ftp_util.cc b/net/ftp/ftp_util.cc
index 2633e9d5dfa4d016c353d948101f3e8a53fd9388..948fe0c528964a6d78a8bc451f1833101902436b 100644
--- a/net/ftp/ftp_util.cc
+++ b/net/ftp/ftp_util.cc
@@ -12,6 +12,7 @@
#include "base/string_util.h"
#include "base/time.h"
#include "base/utf_string_conversions.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 +109,39 @@ 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::Locale::getAvailableLocales(locales_count);
jungshik at Google 2011/03/17 22:59:08 This will return a lot more entries than we have d
Paweł Hajdan Jr. 2011/03/18 09:04:41 Good idea, done.
+
+ // 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++) {
jungshik at Google 2011/03/17 22:59:08 Every time this function is called, we have to go
Paweł Hajdan Jr. 2011/03/18 09:04:41 I was considering some ways to make it faster, but
+ 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).
jungshik at Google 2011/03/17 22:59:08 Have you tried parsing a whole 'date string' inste
Paweł Hajdan Jr. 2011/03/18 09:04:41 Parsing a whole date string may accept more than w
+ 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 +152,7 @@ bool FtpUtil::LsDateListingToTime(const string16& month, const string16& day,
base::Time* result) {
jungshik at Google 2011/03/17 22:59:08 Hmm... Do all the ftp servers use 'day month year'
Paweł Hajdan Jr. 2011/03/18 09:04:41 They do. I consider that a part of the listing for
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))
« no previous file with comments | « net/ftp/ftp_util.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698