| Index: base/file_util.cc | 
| =================================================================== | 
| --- base/file_util.cc	(revision 6039) | 
| +++ base/file_util.cc	(working copy) | 
| @@ -13,41 +13,45 @@ | 
| #include "base/string_util.h" | 
| #include "unicode/uniset.h" | 
|  | 
| +#include "base/string_piece.h" | 
| +#include "base/sys_string_conversions.h" | 
| + | 
| namespace file_util { | 
|  | 
| -const wchar_t kExtensionSeparator = L'.'; | 
| - | 
| -void PathComponents(const std::wstring& path, | 
| -                    std::vector<std::wstring>* components) { | 
| -  DCHECK(components != NULL); | 
| -  if (components == NULL) | 
| +void PathComponents(const FilePath& path, | 
| +                    std::vector<FilePath::StringType>* components) { | 
| +  DCHECK(components); | 
| +  if (!components) | 
| return; | 
| -  std::wstring::size_type start = 0; | 
| -  std::wstring::size_type end = path.find(kPathSeparator, start); | 
|  | 
| -  // Special case the "/" or "\" directory.  On Windows with a drive letter, | 
| -  // this code path won't hit, but the right thing should still happen. | 
| -  // "E:\foo" will turn into "E:","foo". | 
| +  FilePath::StringType path_str = path.value(); | 
| +  FilePath::StringType::size_type start = 0; | 
| +  FilePath::StringType::size_type end = | 
| +      path_str.find_first_of(FilePath::kSeparators); | 
| + | 
| +  // If the path starts with a separator, add it to components. | 
| if (end == start) { | 
| -    components->push_back(std::wstring(path, 0, 1)); | 
| +    components->push_back(FilePath::StringType(path_str, 0, 1)); | 
| start = end + 1; | 
| -    end = path.find(kPathSeparator, start); | 
| +    end = path_str.find_first_of(FilePath::kSeparators, start); | 
| } | 
| -  while (end != std::wstring::npos) { | 
| -    std::wstring component = std::wstring(path, start, end - start); | 
| +  while (end != FilePath::StringType::npos) { | 
| +    FilePath::StringType component = | 
| +        FilePath::StringType(path_str, start, end - start); | 
| components->push_back(component); | 
| start = end + 1; | 
| -    end = path.find(kPathSeparator, start); | 
| +    end = path_str.find(FilePath::kSeparators, start); | 
| } | 
| -  std::wstring component = std::wstring(path, start); | 
| -  components->push_back(component); | 
| + | 
| +  components->push_back(FilePath::StringType(path_str, start)); | 
| } | 
|  | 
| -bool EndsWithSeparator(const FilePath& file_path) { | 
| -  std::wstring path = file_path.ToWStringHack(); | 
| -  bool is_sep = (path.length() > 0 && | 
| -      path[path.length() - 1] == kPathSeparator); | 
| -  return is_sep; | 
| +bool EndsWithSeparator(const FilePath& path) { | 
| +  FilePath::StringType value = path.value(); | 
| +  if (value.empty()) | 
| +    return false; | 
| + | 
| +  return FilePath::IsSeparator(value[value.size() - 1]); | 
| } | 
|  | 
| bool EnsureEndsWithSeparator(FilePath* path) { | 
| @@ -69,34 +73,6 @@ | 
| dir->resize(dir->length() - 1); | 
| } | 
|  | 
| -void UpOneDirectory(std::wstring* dir) { | 
| -  TrimTrailingSeparator(dir); | 
| - | 
| -  std::wstring::size_type last_sep = dir->find_last_of(kPathSeparator); | 
| -  if (last_sep != std::wstring::npos) | 
| -    dir->resize(last_sep); | 
| -} | 
| - | 
| -void UpOneDirectoryOrEmpty(std::wstring* dir) { | 
| -  TrimTrailingSeparator(dir); | 
| - | 
| -  std::wstring::size_type last_sep = dir->find_last_of(kPathSeparator); | 
| -  if (last_sep != std::wstring::npos) | 
| -    dir->resize(last_sep); | 
| -  else | 
| -    dir->clear(); | 
| -} | 
| - | 
| -void TrimFilename(std::wstring* path) { | 
| -  if (EndsWithSeparator(path)) { | 
| -    TrimTrailingSeparator(path); | 
| -  } else { | 
| -    std::wstring::size_type last_sep = path->find_last_of(kPathSeparator); | 
| -    if (last_sep != std::wstring::npos) | 
| -      path->resize(last_sep); | 
| -  } | 
| -} | 
| - | 
| std::wstring GetFilenameFromPath(const std::wstring& path) { | 
| // TODO(erikkay): fix this - it's not using kPathSeparator, but win unit test | 
| // are exercising '/' as a path separator as well. | 
| @@ -118,34 +94,6 @@ | 
| return file_name.substr(0, last_dot); | 
| } | 
|  | 
| -void AppendToPath(std::wstring* path, const std::wstring& new_ending) { | 
| -  if (!path) { | 
| -    NOTREACHED(); | 
| -    return;  // Don't crash in this function in release builds. | 
| -  } | 
| - | 
| -  if (!EndsWithSeparator(path)) | 
| -    path->push_back(kPathSeparator); | 
| -  path->append(new_ending); | 
| -} | 
| - | 
| -void InsertBeforeExtension(std::wstring* path, const std::wstring& suffix) { | 
| -  DCHECK(path); | 
| - | 
| -  const std::wstring::size_type last_dot = path->rfind(kExtensionSeparator); | 
| -  const std::wstring::size_type last_sep = path->rfind(kPathSeparator); | 
| - | 
| -  if (last_dot == std::wstring::npos || | 
| -      (last_sep != std::wstring::npos && last_dot < last_sep)) { | 
| -    // The path looks something like "C:\pics.old\jojo" or "C:\pics\jojo". | 
| -    // We should just append the suffix to the entire path. | 
| -    path->append(suffix); | 
| -    return; | 
| -  } | 
| - | 
| -  path->insert(last_dot, suffix); | 
| -} | 
| - | 
| void ReplaceIllegalCharacters(std::wstring* file_name, int replace_char) { | 
| DCHECK(file_name); | 
|  | 
| @@ -216,39 +164,6 @@ | 
| #endif | 
| } | 
|  | 
| -// Appends the extension to file adding a '.' if extension doesn't contain one. | 
| -// This does nothing if extension is empty or '.'. This is used internally by | 
| -// ReplaceExtension. | 
| -static void AppendExtension(const std::wstring& extension, | 
| -                            std::wstring* file) { | 
| -  if (!extension.empty() && extension != L".") { | 
| -    if (extension[0] != L'.') | 
| -      file->append(L"."); | 
| -    file->append(extension); | 
| -  } | 
| -} | 
| - | 
| -void ReplaceExtension(std::wstring* file_name, const std::wstring& extension) { | 
| -  const std::wstring::size_type last_dot = file_name->rfind(L'.'); | 
| -  if (last_dot == std::wstring::npos) { | 
| -    // No extension, just append the supplied extension. | 
| -    AppendExtension(extension, file_name); | 
| -    return; | 
| -  } | 
| -  const std::wstring::size_type last_separator = | 
| -      file_name->rfind(kPathSeparator); | 
| -  if (last_separator != std::wstring::npos && last_dot < last_separator) { | 
| -    // File name doesn't have extension, but one of the directories does; don't | 
| -    // replace it, just append the supplied extension. For example | 
| -    // 'c:\tmp.bar\foo'. | 
| -    AppendExtension(extension, file_name); | 
| -    return; | 
| -  } | 
| -  std::wstring result = file_name->substr(0, last_dot); | 
| -  AppendExtension(extension, &result); | 
| -  file_name->swap(result); | 
| -} | 
| - | 
| bool ContentsEqual(const FilePath& filename1, const FilePath& filename2) { | 
| // We open the file in binary format even if they are text files because | 
| // we are just comparing that bytes are exactly same in both files and not | 
| @@ -257,7 +172,7 @@ | 
| std::ios::in | std::ios::binary); | 
| std::ifstream file2(filename2.value().c_str(), | 
| std::ios::in | std::ios::binary); | 
| - | 
| + | 
| // Even if both files aren't openable (and thus, in some sense, "equal"), | 
| // any unusable file yields a result of "false". | 
| if (!file1.is_open() || !file2.is_open()) | 
| @@ -323,40 +238,31 @@ | 
| *path_str = path.ToWStringHack(); | 
| return true; | 
| } | 
| -bool Delete(const std::wstring& path, bool recursive) { | 
| -  return Delete(FilePath::FromWStringHack(path), recursive); | 
| +void AppendToPath(std::wstring* path, const std::wstring& new_ending) { | 
| +  if (!path) { | 
| +    NOTREACHED(); | 
| +    return;  // Don't crash in this function in release builds. | 
| +  } | 
| + | 
| +  if (!EndsWithSeparator(path)) | 
| +    path->push_back(FilePath::kSeparators[0]); | 
| +  path->append(new_ending); | 
| } | 
| -bool EndsWithSeparator(std::wstring* path) { | 
| -  return EndsWithSeparator(FilePath::FromWStringHack(*path)); | 
| -} | 
| -bool EndsWithSeparator(const std::wstring& path) { | 
| -  return EndsWithSeparator(FilePath::FromWStringHack(path)); | 
| -} | 
| -bool Move(const std::wstring& from_path, const std::wstring& to_path) { | 
| -  return Move(FilePath::FromWStringHack(from_path), | 
| -              FilePath::FromWStringHack(to_path)); | 
| -} | 
| -bool CopyFile(const std::wstring& from_path, const std::wstring& to_path) { | 
| -  return CopyFile(FilePath::FromWStringHack(from_path), | 
| -                  FilePath::FromWStringHack(to_path)); | 
| -} | 
| bool CopyDirectory(const std::wstring& from_path, const std::wstring& to_path, | 
| bool recursive) { | 
| return CopyDirectory(FilePath::FromWStringHack(from_path), | 
| FilePath::FromWStringHack(to_path), | 
| recursive); | 
| } | 
| -bool PathExists(const std::wstring& path) { | 
| -  return PathExists(FilePath::FromWStringHack(path)); | 
| -} | 
| -bool DirectoryExists(const std::wstring& path) { | 
| -  return DirectoryExists(FilePath::FromWStringHack(path)); | 
| -} | 
| bool ContentsEqual(const std::wstring& filename1, | 
| const std::wstring& filename2) { | 
| return ContentsEqual(FilePath::FromWStringHack(filename1), | 
| FilePath::FromWStringHack(filename2)); | 
| } | 
| +bool CopyFile(const std::wstring& from_path, const std::wstring& to_path) { | 
| +  return CopyFile(FilePath::FromWStringHack(from_path), | 
| +                  FilePath::FromWStringHack(to_path)); | 
| +} | 
| bool CreateDirectory(const std::wstring& full_path) { | 
| return CreateDirectory(FilePath::FromWStringHack(full_path)); | 
| } | 
| @@ -367,6 +273,18 @@ | 
| *temp_file = temp_file_path.ToWStringHack(); | 
| return true; | 
| } | 
| +bool Delete(const std::wstring& path, bool recursive) { | 
| +  return Delete(FilePath::FromWStringHack(path), recursive); | 
| +} | 
| +bool DirectoryExists(const std::wstring& path) { | 
| +  return DirectoryExists(FilePath::FromWStringHack(path)); | 
| +} | 
| +bool EndsWithSeparator(std::wstring* path) { | 
| +  return EndsWithSeparator(FilePath::FromWStringHack(*path)); | 
| +} | 
| +bool EndsWithSeparator(const std::wstring& path) { | 
| +  return EndsWithSeparator(FilePath::FromWStringHack(path)); | 
| +} | 
| bool GetCurrentDirectory(std::wstring* path_str) { | 
| FilePath path; | 
| if (!GetCurrentDirectory(&path)) | 
| @@ -387,12 +305,38 @@ | 
| *path_str = path.ToWStringHack(); | 
| return true; | 
| } | 
| +bool Move(const std::wstring& from_path, const std::wstring& to_path) { | 
| +  return Move(FilePath::FromWStringHack(from_path), | 
| +              FilePath::FromWStringHack(to_path)); | 
| +} | 
| FILE* OpenFile(const std::wstring& filename, const char* mode) { | 
| return OpenFile(FilePath::FromWStringHack(filename), mode); | 
| } | 
| +bool PathExists(const std::wstring& path) { | 
| +  return PathExists(FilePath::FromWStringHack(path)); | 
| +} | 
| bool SetCurrentDirectory(const std::wstring& directory) { | 
| return SetCurrentDirectory(FilePath::FromWStringHack(directory)); | 
| } | 
| +void TrimFilename(std::wstring* path) { | 
| +  if (EndsWithSeparator(path)) { | 
| +    TrimTrailingSeparator(path); | 
| +  } else { | 
| +    *path = FilePath::FromWStringHack(*path).DirName().ToWStringHack(); | 
| +  } | 
| +} | 
| +void UpOneDirectory(std::wstring* dir) { | 
| +  FilePath path = FilePath::FromWStringHack(*dir); | 
| +  *dir = path.DirName().ToWStringHack(); | 
| +} | 
| +void UpOneDirectoryOrEmpty(std::wstring* dir) { | 
| +  FilePath path = FilePath::FromWStringHack(*dir); | 
| +  FilePath directory = path.DirName(); | 
|  | 
| +  if (directory == path) | 
| +    dir->clear(); | 
| +  else | 
| +    *dir = directory.ToWStringHack(); | 
| +} | 
| }  // namespace | 
|  | 
|  |