diff options
author | tc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-08-22 05:10:59 +0000 |
---|---|---|
committer | tc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-08-22 05:10:59 +0000 |
commit | a7e79591fd7db823cd278ff43616ba4a22108213 (patch) | |
tree | 512e2f2a282595c51cfa3bb48e0de9d2d5a46251 /net/base/net_util_win.cc | |
parent | 1ea9aac8836d5532c8d9ef5cf57f3653f0af1347 (diff) | |
download | chromium_src-a7e79591fd7db823cd278ff43616ba4a22108213.zip chromium_src-a7e79591fd7db823cd278ff43616ba4a22108213.tar.gz chromium_src-a7e79591fd7db823cd278ff43616ba4a22108213.tar.bz2 |
Move FileURLToFilePath into platform specific files. Most of the logic in this function is specific to windows' file system.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@1211 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/net_util_win.cc')
-rw-r--r-- | net/base/net_util_win.cc | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/net/base/net_util_win.cc b/net/base/net_util_win.cc new file mode 100644 index 0000000..9295b7e --- /dev/null +++ b/net/base/net_util_win.cc @@ -0,0 +1,111 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "net/base/net_util.h" + +#include "base/string_piece.h" +#include "base/string_util.h" +#include "base/sys_string_conversions.h" +#include "googleurl/src/gurl.h" +#include "net/base/escape.h" + +namespace net { + +bool FileURLToFilePath(const GURL& url, std::wstring* file_path) { + file_path->clear(); + + if (!url.is_valid()) + return false; + + std::string path; + std::string host = url.host(); + if (host.empty()) { + // URL contains no host, the path is the filename. In this case, the path + // will probably be preceeded with a slash, as in "/C:/foo.txt", so we + // trim out that here. + path = url.path(); + size_t first_non_slash = path.find_first_not_of("/\\"); + if (first_non_slash != std::string::npos && first_non_slash > 0) + path.erase(0, first_non_slash); + } else { + // URL contains a host: this means it's UNC. We keep the preceeding slash + // on the path. + path = "\\\\"; + path.append(host); + path.append(url.path()); + } + + if (path.empty()) + return false; + std::replace(path.begin(), path.end(), '/', '\\'); + + // GURL stores strings as percent-encoded UTF-8, this will undo if possible. + path = UnescapeURLComponent(path, + UnescapeRule::SPACES | UnescapeRule::URL_SPECIAL_CHARS); + + if (!IsStringUTF8(path.c_str())) { + // Not UTF-8, assume encoding is native codepage and we're done. We know we + // are giving the conversion function a nonempty string, and it may fail if + // the given string is not in the current encoding and give us an empty + // string back. We detect this and report failure. + *file_path = base::SysNativeMBToWide(path); + return !file_path->empty(); + } + file_path->assign(UTF8ToWide(path)); + + // Now we have an unescaped filename, but are still not sure about its + // encoding. For example, each character could be part of a UTF-8 string. + if (file_path->empty() || !IsString8Bit(*file_path)) { + // assume our 16-bit encoding is correct if it won't fit into an 8-bit + // string + return true; + } + + // Convert our narrow string into the native wide path. + std::string narrow; + if (!WideToLatin1(*file_path, &narrow)) { + NOTREACHED() << "Should have filtered out non-8-bit strings above."; + return false; + } + if (IsStringUTF8(narrow.c_str())) { + // Our string actually looks like it could be UTF-8, convert to 8-bit + // UTF-8 and then to the corresponding wide string. + *file_path = UTF8ToWide(narrow); + } else { + // Our wide string contains only 8-bit characters and it's not UTF-8, so + // we assume it's in the native codepage. + *file_path = base::SysNativeMBToWide(narrow); + } + + // Fail if 8-bit -> wide conversion failed and gave us an empty string back + // (we already filtered out empty strings above). + return !file_path->empty(); +} + +} // namespace net |