| 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
|
|
|