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

Unified Diff: net/ftp/ftp_directory_listing_parser.cc

Issue 6718043: FTP: Multiple fixes for localized directory listings: (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: update copyright year for the bot Created 9 years, 8 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/data/ftp/dir-listing-ls-27.expected ('k') | net/ftp/ftp_directory_listing_parser_ls.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/ftp/ftp_directory_listing_parser.cc
diff --git a/net/ftp/ftp_directory_listing_parser.cc b/net/ftp/ftp_directory_listing_parser.cc
index 8c36bb6953834299d8783d36f46585be2af5c310..7d47725d2258f88e277de77f6ac7ee7a75f4f2e2 100644
--- a/net/ftp/ftp_directory_listing_parser.cc
+++ b/net/ftp/ftp_directory_listing_parser.cc
@@ -16,93 +16,109 @@
#include "net/ftp/ftp_directory_listing_parser_windows.h"
#include "net/ftp/ftp_server_type_histograms.h"
-namespace {
-
-// Converts a string with unknown character encoding to UTF-16. On success
-// fills in |converted_text| and |encoding|. Returns network error code.
-int ConvertStringToUTF16(const std::string& text,
- string16* converted_text,
- std::string* encoding) {
- std::vector<std::string> encodings;
- if (!base::DetectAllEncodings(text, &encodings))
- return net::ERR_ENCODING_DETECTION_FAILED;
-
- // Use first encoding that can be used to decode the text.
- for (size_t i = 0; i < encodings.size(); i++) {
- if (base::CodepageToUTF16(text,
- encodings[i].c_str(),
- base::OnStringConversionError::FAIL,
- converted_text)) {
- *encoding = encodings[i];
- return net::OK;
- }
- }
+namespace net {
- return net::ERR_ENCODING_DETECTION_FAILED;
-}
+namespace {
+// Fills in |raw_name| for all |entries| using |encoding|. Returns network
+// error code.
int FillInRawName(const std::string& encoding,
- std::vector<net::FtpDirectoryListingEntry>* entries) {
+ std::vector<FtpDirectoryListingEntry>* entries) {
for (size_t i = 0; i < entries->size(); i++) {
if (!base::UTF16ToCodepage(entries->at(i).name, encoding.c_str(),
base::OnStringConversionError::FAIL,
&entries->at(i).raw_name)) {
- return net::ERR_ENCODING_CONVERSION_FAILED;
+ return ERR_ENCODING_CONVERSION_FAILED;
}
}
- return net::OK;
+ return OK;
}
-} // namespace
-
-namespace net {
-
-FtpDirectoryListingEntry::FtpDirectoryListingEntry() {
-}
-
-int ParseFtpDirectoryListing(const std::string& text,
- const base::Time& current_time,
- std::vector<FtpDirectoryListingEntry>* entries) {
- std::string encoding;
-
- string16 converted_text;
- int rv = ConvertStringToUTF16(text, &converted_text, &encoding);
- if (rv != OK)
- return rv;
-
+// Parses |text| as an FTP directory listing. Fills in |entries|
+// and |server_type| and returns network error code.
+int ParseListing(const string16& text,
+ const std::string& encoding,
+ const base::Time& current_time,
+ std::vector<FtpDirectoryListingEntry>* entries,
+ FtpServerType* server_type) {
std::vector<string16> lines;
- base::SplitString(converted_text, '\n', &lines);
+ base::SplitString(text, '\n', &lines);
// TODO(phajdan.jr): Use a table of callbacks instead of repeating code.
entries->clear();
if (ParseFtpDirectoryListingLs(lines, current_time, entries)) {
- UpdateFtpServerTypeHistograms(SERVER_LS);
+ *server_type = SERVER_LS;
return FillInRawName(encoding, entries);
}
entries->clear();
if (ParseFtpDirectoryListingWindows(lines, entries)) {
- UpdateFtpServerTypeHistograms(SERVER_WINDOWS);
+ *server_type = SERVER_WINDOWS;
return FillInRawName(encoding, entries);
}
entries->clear();
if (ParseFtpDirectoryListingVms(lines, entries)) {
- UpdateFtpServerTypeHistograms(SERVER_VMS);
+ *server_type = SERVER_VMS;
return FillInRawName(encoding, entries);
}
entries->clear();
if (ParseFtpDirectoryListingNetware(lines, current_time, entries)) {
- UpdateFtpServerTypeHistograms(SERVER_NETWARE);
+ *server_type = SERVER_NETWARE;
return FillInRawName(encoding, entries);
}
entries->clear();
- UpdateFtpServerTypeHistograms(SERVER_UNKNOWN);
+ return ERR_UNRECOGNIZED_FTP_DIRECTORY_LISTING_FORMAT;
+}
+
+// Detects encoding of |text| and parses it as an FTP directory listing.
+// Fills in |entries| and |server_type| and returns network error code.
+int DecodeAndParse(const std::string& text,
+ const base::Time& current_time,
+ std::vector<FtpDirectoryListingEntry>* entries,
+ FtpServerType* server_type) {
+ std::vector<std::string> encodings;
+ if (!base::DetectAllEncodings(text, &encodings))
+ return ERR_ENCODING_DETECTION_FAILED;
+
+ // Use first encoding that can be used to decode the text.
+ for (size_t i = 0; i < encodings.size(); i++) {
+ string16 converted_text;
+ if (base::CodepageToUTF16(text,
+ encodings[i].c_str(),
+ base::OnStringConversionError::FAIL,
+ &converted_text)) {
+ int rv = ParseListing(converted_text,
+ encodings[i],
+ current_time,
+ entries,
+ server_type);
+ if (rv == OK)
+ return rv;
+ }
+ }
+
+ entries->clear();
+ *server_type = SERVER_UNKNOWN;
return ERR_UNRECOGNIZED_FTP_DIRECTORY_LISTING_FORMAT;
}
} // namespace
+
+FtpDirectoryListingEntry::FtpDirectoryListingEntry() {
+}
+
+int ParseFtpDirectoryListing(const std::string& text,
+ const base::Time& current_time,
+ std::vector<FtpDirectoryListingEntry>* entries) {
+ FtpServerType server_type = SERVER_UNKNOWN;
+ int rv = DecodeAndParse(text, current_time, entries, &server_type);
+ UpdateFtpServerTypeHistograms(server_type);
+ return rv;
+}
+
+} // namespace net
« no previous file with comments | « net/data/ftp/dir-listing-ls-27.expected ('k') | net/ftp/ftp_directory_listing_parser_ls.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698