Index: net/base/net_util.cc |
=================================================================== |
--- net/base/net_util.cc (revision 29772) |
+++ net/base/net_util.cc (working copy) |
@@ -749,6 +749,18 @@ |
return result; |
} |
+// Converts a UTF-8 string to a FilePath string type. |
+// |
+// This is inline with the hope that the function will be "free" on non-Windows |
+// platforms. |
+inline FilePath::StringType UTF8ToFilePathString(const std::string& utf8) { |
+#if defined(OS_WIN) |
+ return FilePath::StringType(UTF8ToUTF16(utf8)); |
+#else |
+ return utf8; |
+#endif |
+} |
+ |
} // namespace |
namespace net { |
@@ -805,19 +817,19 @@ |
return GetSpecificHeaderT(headers, name); |
} |
-std::wstring GetFileNameFromCD(const std::string& header, |
- const std::string& referrer_charset) { |
+std::string GetFileNameFromCD(const std::string& header, |
+ const std::string& referrer_charset) { |
std::string param_value = GetHeaderParamValue(header, "filename"); |
if (param_value.empty()) { |
// Some servers use 'name' parameter. |
param_value = GetHeaderParamValue(header, "name"); |
} |
if (param_value.empty()) |
- return std::wstring(); |
+ return std::string(); |
std::string decoded; |
if (DecodeParamValue(param_value, referrer_charset, &decoded)) |
- return UTF8ToWide(decoded); |
- return std::wstring(); |
+ return decoded; |
+ return std::string(); |
} |
std::wstring GetHeaderParamValue(const std::wstring& field, |
@@ -1032,60 +1044,72 @@ |
text.substr(www.length()) : text; |
} |
-std::wstring GetSuggestedFilename(const GURL& url, |
- const std::string& content_disposition, |
- const std::string& referrer_charset, |
- const std::wstring& default_name) { |
+FilePath GetSuggestedFilename(const GURL& url, |
+ const std::string& content_disposition, |
+ const std::string& referrer_charset, |
+ const char* default_name) { |
// TODO(rolandsteiner): as pointed out by darin in the code review, this is |
// hardly ideal. "download" should be translated, or another solution found. |
// (cf. http://code.google.com/p/chromium/issues/detail?id=25289) |
- const wchar_t kFinalFallbackName[] = L"download"; |
+ const char kFinalFallbackName[] = "download"; |
// about: and data: URLs don't have file names, but esp. data: URLs may |
// contain parts that look like ones (i.e., contain a slash). |
// Therefore we don't attempt to divine a file name out of them. |
- if (url.SchemeIs("about") || url.SchemeIs("data")) |
- return default_name.empty() ? std::wstring(kFinalFallbackName) |
- : default_name; |
+ if (url.SchemeIs("about") || url.SchemeIs("data")) { |
+ return FilePath(UTF8ToFilePathString( |
+ default_name && default_name[0] ? default_name : kFinalFallbackName)); |
+ } |
- std::wstring filename = GetFileNameFromCD(content_disposition, |
- referrer_charset); |
+ std::string filename = GetFileNameFromCD(content_disposition, |
+ referrer_charset); |
if (!filename.empty()) { |
// Remove any path information the server may have sent, take the name |
// only. |
- filename = file_util::GetFilenameFromPath(filename); |
+#if defined(OS_WIN) |
+ filename = UTF16ToUTF8(FilePath(UTF8ToUTF16(filename)).BaseName().value()); |
+#else |
+ filename = FilePath(filename).BaseName().value(); |
+#endif |
+ |
// Next, remove "." from the beginning and end of the file name to avoid |
// tricks with hidden files, "..", and "." |
- TrimString(filename, L".", &filename); |
+ TrimString(filename, ".", &filename); |
} |
if (filename.empty()) { |
if (url.is_valid()) { |
- filename = UnescapeAndDecodeUTF8URLComponent( |
+ filename = UnescapeURLComponent( |
url.ExtractFileName(), |
UnescapeRule::SPACES | UnescapeRule::URL_SPECIAL_CHARS); |
} |
} |
// Trim '.' once more. |
- TrimString(filename, L".", &filename); |
+ TrimString(filename, ".", &filename); |
+ |
// If there's no filename or it gets trimed to be empty, use |
// the URL hostname or default_name |
if (filename.empty()) { |
- if (!default_name.empty()) { |
+ if (default_name && default_name[0]) { |
filename = default_name; |
} else if (url.is_valid()) { |
// Some schemes (e.g. file) do not have a hostname. Even though it's |
// not likely to reach here, let's hardcode the last fallback name. |
// TODO(jungshik) : Decode a 'punycoded' IDN hostname. (bug 1264451) |
- filename = url.host().empty() ? std::wstring(kFinalFallbackName) |
- : UTF8ToWide(url.host()); |
+ filename = url.host().empty() ? std::string(kFinalFallbackName) |
+ : url.host(); |
} else { |
NOTREACHED(); |
} |
} |
- file_util::ReplaceIllegalCharacters(&filename, '-'); |
- return filename; |
+#if defined(OS_WIN) |
+ FilePath::StringType file_path_string = UTF8ToWide(filename); |
+#else |
+ std::string& file_path_string = filename; |
+#endif |
+ file_util::ReplaceIllegalCharactersInPath(&file_path_string, '-'); |
+ return FilePath(file_path_string); |
} |
bool IsPortAllowedByDefault(int port) { |