OLD | NEW |
---|---|
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 "net/ftp/ftp_util.h" | 5 #include "net/ftp/ftp_util.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/i18n/case_conversion.h" | 10 #include "base/i18n/case_conversion.h" |
11 #include "base/i18n/char_iterator.h" | 11 #include "base/i18n/char_iterator.h" |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/memory/singleton.h" | 13 #include "base/memory/singleton.h" |
14 #include "base/string_number_conversions.h" | 14 #include "base/string_number_conversions.h" |
15 #include "base/string_split.h" | |
15 #include "base/string_tokenizer.h" | 16 #include "base/string_tokenizer.h" |
16 #include "base/string_util.h" | 17 #include "base/string_util.h" |
17 #include "base/time.h" | 18 #include "base/time.h" |
18 #include "base/utf_string_conversions.h" | 19 #include "base/utf_string_conversions.h" |
19 #include "unicode/datefmt.h" | 20 #include "unicode/datefmt.h" |
20 #include "unicode/dtfmtsym.h" | 21 #include "unicode/dtfmtsym.h" |
21 #include "unicode/uchar.h" | 22 #include "unicode/uchar.h" |
22 | 23 |
23 // For examples of Unix<->VMS path conversions, see the unit test file. On VMS | 24 // For examples of Unix<->VMS path conversions, see the unit test file. On VMS |
24 // a path looks differently depending on whether it's a file or directory. | 25 // a path looks differently depending on whether it's a file or directory. |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
248 time_exploded.year = current_exploded.year; | 249 time_exploded.year = current_exploded.year; |
249 } | 250 } |
250 } | 251 } |
251 | 252 |
252 // We don't know the time zone of the listing, so just use local time. | 253 // We don't know the time zone of the listing, so just use local time. |
253 *result = base::Time::FromLocalExploded(time_exploded); | 254 *result = base::Time::FromLocalExploded(time_exploded); |
254 return true; | 255 return true; |
255 } | 256 } |
256 | 257 |
257 // static | 258 // static |
259 bool FtpUtil::WindowsDateListingToTime(const string16& date, | |
eroman
2011/08/10 23:52:16
I didn't review this, I presume it is just a move.
Paweł Hajdan Jr.
2011/08/11 00:03:19
Not really, I changed it a bit to make AM/PM optio
| |
260 const string16& time, | |
261 base::Time* result) { | |
262 base::Time::Exploded time_exploded = { 0 }; | |
263 | |
264 // Date should be in format MM-DD-YY[YY]. | |
265 std::vector<string16> date_parts; | |
266 base::SplitString(date, '-', &date_parts); | |
267 if (date_parts.size() != 3) | |
268 return false; | |
269 if (!base::StringToInt(date_parts[0], &time_exploded.month)) | |
270 return false; | |
271 if (!base::StringToInt(date_parts[1], &time_exploded.day_of_month)) | |
272 return false; | |
273 if (!base::StringToInt(date_parts[2], &time_exploded.year)) | |
274 return false; | |
275 if (time_exploded.year < 0) | |
276 return false; | |
277 // If year has only two digits then assume that 00-79 is 2000-2079, | |
278 // and 80-99 is 1980-1999. | |
279 if (time_exploded.year < 80) | |
280 time_exploded.year += 2000; | |
281 else if (time_exploded.year < 100) | |
282 time_exploded.year += 1900; | |
283 | |
284 // Time should be in format HH:MM[(AM|PM)] | |
285 if (time.length() < 5) | |
286 return false; | |
287 | |
288 std::vector<string16> time_parts; | |
289 base::SplitString(time.substr(0, 5), ':', &time_parts); | |
290 if (time_parts.size() != 2) | |
291 return false; | |
292 if (!base::StringToInt(time_parts[0], &time_exploded.hour)) | |
293 return false; | |
294 if (!base::StringToInt(time_parts[1], &time_exploded.minute)) | |
295 return false; | |
296 if (!time_exploded.HasValidValues()) | |
297 return false; | |
298 | |
299 if (time.length() > 5) { | |
300 if (time.length() != 7) | |
301 return false; | |
302 string16 am_or_pm(time.substr(5, 2)); | |
303 if (EqualsASCII(am_or_pm, "PM")) { | |
304 if (time_exploded.hour < 12) | |
305 time_exploded.hour += 12; | |
306 } else if (EqualsASCII(am_or_pm, "AM")) { | |
307 if (time_exploded.hour == 12) | |
308 time_exploded.hour = 0; | |
309 } else { | |
310 return false; | |
311 } | |
312 } | |
313 | |
314 // We don't know the time zone of the server, so just use local time. | |
315 *result = base::Time::FromLocalExploded(time_exploded); | |
316 return true; | |
317 } | |
318 | |
319 // static | |
258 string16 FtpUtil::GetStringPartAfterColumns(const string16& text, int columns) { | 320 string16 FtpUtil::GetStringPartAfterColumns(const string16& text, int columns) { |
259 base::i18n::UTF16CharIterator iter(&text); | 321 base::i18n::UTF16CharIterator iter(&text); |
260 | 322 |
261 // TODO(jshin): Is u_isspace the right function to use here? | 323 // TODO(jshin): Is u_isspace the right function to use here? |
262 for (int i = 0; i < columns; i++) { | 324 for (int i = 0; i < columns; i++) { |
263 // Skip the leading whitespace. | 325 // Skip the leading whitespace. |
264 while (!iter.end() && u_isspace(iter.get())) | 326 while (!iter.end() && u_isspace(iter.get())) |
265 iter.Advance(); | 327 iter.Advance(); |
266 | 328 |
267 // Skip the actual text of i-th column. | 329 // Skip the actual text of i-th column. |
268 while (!iter.end() && !u_isspace(iter.get())) | 330 while (!iter.end() && !u_isspace(iter.get())) |
269 iter.Advance(); | 331 iter.Advance(); |
270 } | 332 } |
271 | 333 |
272 string16 result(text.substr(iter.array_pos())); | 334 string16 result(text.substr(iter.array_pos())); |
273 TrimWhitespace(result, TRIM_ALL, &result); | 335 TrimWhitespace(result, TRIM_ALL, &result); |
274 return result; | 336 return result; |
275 } | 337 } |
276 | 338 |
277 } // namespace | 339 } // namespace |
OLD | NEW |