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

Side by Side Diff: components/filesystem/directory_impl.cc

Issue 1166763002: Reland "Mandoline filesystem: Build the filesystem on windows." (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: DWORD -> INT for real checking. (This was wrong.) Created 5 years, 6 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 unified diff | Download patch
« no previous file with comments | « no previous file | components/filesystem/directory_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/filesystem/directory_impl.h" 5 #include "components/filesystem/directory_impl.h"
6 6
7 #include "base/files/file.h" 7 #include "base/files/file.h"
8 #include "base/files/file_enumerator.h" 8 #include "base/files/file_enumerator.h"
9 #include "base/files/file_util.h" 9 #include "base/files/file_util.h"
10 #include "base/files/scoped_temp_dir.h" 10 #include "base/files/scoped_temp_dir.h"
(...skipping 19 matching lines...) Expand all
30 void DirectoryImpl::Read(const ReadCallback& callback) { 30 void DirectoryImpl::Read(const ReadCallback& callback) {
31 mojo::Array<DirectoryEntryPtr> entries(0); 31 mojo::Array<DirectoryEntryPtr> entries(0);
32 base::FileEnumerator directory_enumerator( 32 base::FileEnumerator directory_enumerator(
33 directory_path_, false, 33 directory_path_, false,
34 base::FileEnumerator::DIRECTORIES | base::FileEnumerator::FILES); 34 base::FileEnumerator::DIRECTORIES | base::FileEnumerator::FILES);
35 for (base::FilePath name = directory_enumerator.Next(); !name.empty(); 35 for (base::FilePath name = directory_enumerator.Next(); !name.empty();
36 name = directory_enumerator.Next()) { 36 name = directory_enumerator.Next()) {
37 base::FileEnumerator::FileInfo info = directory_enumerator.GetInfo(); 37 base::FileEnumerator::FileInfo info = directory_enumerator.GetInfo();
38 DirectoryEntryPtr entry = DirectoryEntry::New(); 38 DirectoryEntryPtr entry = DirectoryEntry::New();
39 entry->type = info.IsDirectory() 39 entry->type = info.IsDirectory()
40 ? FILE_TYPE_DIRECTORY : FILE_TYPE_REGULAR_FILE; 40 ? FS_FILE_TYPE_DIRECTORY : FS_FILE_TYPE_REGULAR_FILE;
41 entry->name = info.GetName().AsUTF8Unsafe(); 41 entry->name = info.GetName().AsUTF8Unsafe();
42 entries.push_back(entry.Pass()); 42 entries.push_back(entry.Pass());
43 } 43 }
44 44
45 callback.Run(ERROR_OK, entries.Pass()); 45 callback.Run(FILE_ERROR_OK, entries.Pass());
46 } 46 }
47 47
48 // TODO(erg): Consider adding an implementation of Stat()/Touch() to the 48 // TODO(erg): Consider adding an implementation of Stat()/Touch() to the
49 // directory, too. Right now, the base::File abstractions do not really deal 49 // directory, too. Right now, the base::File abstractions do not really deal
50 // with directories properly, so these are broken for now. 50 // with directories properly, so these are broken for now.
51 51
52 // TODO(vtl): Move the implementation to a thread pool. 52 // TODO(vtl): Move the implementation to a thread pool.
53 void DirectoryImpl::OpenFile(const mojo::String& raw_path, 53 void DirectoryImpl::OpenFile(const mojo::String& raw_path,
54 mojo::InterfaceRequest<File> file, 54 mojo::InterfaceRequest<File> file,
55 uint32_t open_flags, 55 uint32_t open_flags,
56 const OpenFileCallback& callback) { 56 const OpenFileCallback& callback) {
57 base::FilePath path; 57 base::FilePath path;
58 if (Error error = ValidatePath(raw_path, directory_path_, &path)) { 58 if (FileError error = ValidatePath(raw_path, directory_path_, &path)) {
59 callback.Run(error); 59 callback.Run(error);
60 return; 60 return;
61 } 61 }
62 62
63 base::File base_file(path, open_flags); 63 base::File base_file(path, open_flags);
64 if (!base_file.IsValid()) { 64 if (!base_file.IsValid()) {
65 callback.Run(ERROR_FAILED); 65 callback.Run(FILE_ERROR_FAILED);
66 return; 66 return;
67 } 67 }
68 68
69 base::File::Info info; 69 base::File::Info info;
70 if (!base_file.GetInfo(&info)) { 70 if (!base_file.GetInfo(&info)) {
71 callback.Run(ERROR_FAILED); 71 callback.Run(FILE_ERROR_FAILED);
72 return; 72 return;
73 } 73 }
74 74
75 if (info.is_directory) { 75 if (info.is_directory) {
76 // We must not return directories as files. In the file abstraction, we can 76 // We must not return directories as files. In the file abstraction, we can
77 // fetch raw file descriptors over mojo pipes, and passing a file 77 // fetch raw file descriptors over mojo pipes, and passing a file
78 // descriptor to a directory is a sandbox escape on Windows. 78 // descriptor to a directory is a sandbox escape on Windows.
79 callback.Run(ERROR_NOT_A_FILE); 79 callback.Run(FILE_ERROR_NOT_A_FILE);
80 return; 80 return;
81 } 81 }
82 82
83 if (file.is_pending()) { 83 if (file.is_pending()) {
84 new FileImpl(file.Pass(), base_file.Pass()); 84 new FileImpl(file.Pass(), base_file.Pass());
85 } 85 }
86 callback.Run(ERROR_OK); 86 callback.Run(FILE_ERROR_OK);
87 } 87 }
88 88
89 void DirectoryImpl::OpenDirectory(const mojo::String& raw_path, 89 void DirectoryImpl::OpenDirectory(const mojo::String& raw_path,
90 mojo::InterfaceRequest<Directory> directory, 90 mojo::InterfaceRequest<Directory> directory,
91 uint32_t open_flags, 91 uint32_t open_flags,
92 const OpenDirectoryCallback& callback) { 92 const OpenDirectoryCallback& callback) {
93 base::FilePath path; 93 base::FilePath path;
94 if (Error error = ValidatePath(raw_path, directory_path_, &path)) { 94 if (FileError error = ValidatePath(raw_path, directory_path_, &path)) {
95 callback.Run(error); 95 callback.Run(error);
96 return; 96 return;
97 } 97 }
98 98
99 if (!base::DirectoryExists(path)) { 99 if (!base::DirectoryExists(path)) {
100 if (base::PathExists(path)) { 100 if (base::PathExists(path)) {
101 callback.Run(ERROR_NOT_A_DIRECTORY); 101 callback.Run(FILE_ERROR_NOT_A_DIRECTORY);
102 return; 102 return;
103 } 103 }
104 104
105 if (!(open_flags & kFlagOpenAlways || open_flags & kFlagCreate)) { 105 if (!(open_flags & kFlagOpenAlways || open_flags & kFlagCreate)) {
106 // The directory doesn't exist, and we weren't passed parameters to 106 // The directory doesn't exist, and we weren't passed parameters to
107 // create it. 107 // create it.
108 callback.Run(ERROR_NOT_FOUND); 108 callback.Run(FILE_ERROR_NOT_FOUND);
109 return; 109 return;
110 } 110 }
111 111
112 base::File::Error error; 112 base::File::Error error;
113 if (!base::CreateDirectoryAndGetError(path, &error)) { 113 if (!base::CreateDirectoryAndGetError(path, &error)) {
114 callback.Run(static_cast<filesystem::Error>(error)); 114 callback.Run(static_cast<filesystem::FileError>(error));
115 return; 115 return;
116 } 116 }
117 } 117 }
118 118
119 if (directory.is_pending()) 119 if (directory.is_pending())
120 new DirectoryImpl(directory.Pass(), path, 120 new DirectoryImpl(directory.Pass(), path,
121 scoped_ptr<base::ScopedTempDir>()); 121 scoped_ptr<base::ScopedTempDir>());
122 callback.Run(ERROR_OK); 122 callback.Run(FILE_ERROR_OK);
123 } 123 }
124 124
125 void DirectoryImpl::Rename(const mojo::String& raw_old_path, 125 void DirectoryImpl::Rename(const mojo::String& raw_old_path,
126 const mojo::String& raw_new_path, 126 const mojo::String& raw_new_path,
127 const RenameCallback& callback) { 127 const RenameCallback& callback) {
128 base::FilePath old_path; 128 base::FilePath old_path;
129 if (Error error = ValidatePath(raw_old_path, directory_path_, &old_path)) { 129 if (FileError error =
130 ValidatePath(raw_old_path, directory_path_, &old_path)) {
130 callback.Run(error); 131 callback.Run(error);
131 return; 132 return;
132 } 133 }
133 134
134 base::FilePath new_path; 135 base::FilePath new_path;
135 if (Error error = ValidatePath(raw_new_path, directory_path_, &new_path)) { 136 if (FileError error =
137 ValidatePath(raw_new_path, directory_path_, &new_path)) {
136 callback.Run(error); 138 callback.Run(error);
137 return; 139 return;
138 } 140 }
139 141
140 if (!base::Move(old_path, new_path)) { 142 if (!base::Move(old_path, new_path)) {
141 callback.Run(ERROR_FAILED); 143 callback.Run(FILE_ERROR_FAILED);
142 return; 144 return;
143 } 145 }
144 146
145 callback.Run(ERROR_OK); 147 callback.Run(FILE_ERROR_OK);
146 } 148 }
147 149
148 void DirectoryImpl::Delete(const mojo::String& raw_path, 150 void DirectoryImpl::Delete(const mojo::String& raw_path,
149 uint32_t delete_flags, 151 uint32_t delete_flags,
150 const DeleteCallback& callback) { 152 const DeleteCallback& callback) {
151 base::FilePath path; 153 base::FilePath path;
152 if (Error error = ValidatePath(raw_path, directory_path_, &path)) { 154 if (FileError error = ValidatePath(raw_path, directory_path_, &path)) {
153 callback.Run(error); 155 callback.Run(error);
154 return; 156 return;
155 } 157 }
156 158
157 bool recursive = delete_flags & kDeleteFlagRecursive; 159 bool recursive = delete_flags & kDeleteFlagRecursive;
158 if (!base::DeleteFile(path, recursive)) { 160 if (!base::DeleteFile(path, recursive)) {
159 callback.Run(ERROR_FAILED); 161 callback.Run(FILE_ERROR_FAILED);
160 return; 162 return;
161 } 163 }
162 164
163 callback.Run(ERROR_OK); 165 callback.Run(FILE_ERROR_OK);
164 } 166 }
165 167
166 } // namespace filesystem 168 } // namespace filesystem
OLDNEW
« no previous file with comments | « no previous file | components/filesystem/directory_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698