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

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

Issue 1962503002: Add mojom module suffix in .mojom files for components/filesystem. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 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
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 <utility> 7 #include <utility>
8 8
9 #include "base/files/file.h" 9 #include "base/files/file.h"
10 #include "base/files/file_enumerator.h" 10 #include "base/files/file_enumerator.h"
11 #include "base/files/file_util.h" 11 #include "base/files/file_util.h"
12 #include "base/files/scoped_temp_dir.h" 12 #include "base/files/scoped_temp_dir.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "build/build_config.h" 14 #include "build/build_config.h"
15 #include "components/filesystem/file_impl.h" 15 #include "components/filesystem/file_impl.h"
16 #include "components/filesystem/lock_table.h" 16 #include "components/filesystem/lock_table.h"
17 #include "components/filesystem/util.h" 17 #include "components/filesystem/util.h"
18 #include "mojo/common/common_type_converters.h" 18 #include "mojo/common/common_type_converters.h"
19 #include "mojo/platform_handle/platform_handle_functions.h" 19 #include "mojo/platform_handle/platform_handle_functions.h"
20 20
21 namespace filesystem { 21 namespace filesystem {
22 22
23 DirectoryImpl::DirectoryImpl(mojo::InterfaceRequest<Directory> request, 23 DirectoryImpl::DirectoryImpl(mojo::InterfaceRequest<mojom::Directory> request,
24 base::FilePath directory_path, 24 base::FilePath directory_path,
25 scoped_refptr<SharedTempDir> temp_dir, 25 scoped_refptr<SharedTempDir> temp_dir,
26 scoped_refptr<LockTable> lock_table) 26 scoped_refptr<LockTable> lock_table)
27 : binding_(this, std::move(request)), 27 : binding_(this, std::move(request)),
28 directory_path_(directory_path), 28 directory_path_(directory_path),
29 temp_dir_(std::move(temp_dir)), 29 temp_dir_(std::move(temp_dir)),
30 lock_table_(std::move(lock_table)) {} 30 lock_table_(std::move(lock_table)) {}
31 31
32 DirectoryImpl::~DirectoryImpl() {} 32 DirectoryImpl::~DirectoryImpl() {}
33 33
34 void DirectoryImpl::Read(const ReadCallback& callback) { 34 void DirectoryImpl::Read(const ReadCallback& callback) {
35 mojo::Array<DirectoryEntryPtr> entries; 35 mojo::Array<mojom::DirectoryEntryPtr> entries;
36 base::FileEnumerator directory_enumerator( 36 base::FileEnumerator directory_enumerator(
37 directory_path_, false, 37 directory_path_, false,
38 base::FileEnumerator::DIRECTORIES | base::FileEnumerator::FILES); 38 base::FileEnumerator::DIRECTORIES | base::FileEnumerator::FILES);
39 for (base::FilePath name = directory_enumerator.Next(); !name.empty(); 39 for (base::FilePath name = directory_enumerator.Next(); !name.empty();
40 name = directory_enumerator.Next()) { 40 name = directory_enumerator.Next()) {
41 base::FileEnumerator::FileInfo info = directory_enumerator.GetInfo(); 41 base::FileEnumerator::FileInfo info = directory_enumerator.GetInfo();
42 DirectoryEntryPtr entry = DirectoryEntry::New(); 42 mojom::DirectoryEntryPtr entry = mojom::DirectoryEntry::New();
43 entry->type = 43 entry->type = info.IsDirectory() ? mojom::FsFileType::DIRECTORY
44 info.IsDirectory() ? FsFileType::DIRECTORY : FsFileType::REGULAR_FILE; 44 : mojom::FsFileType::REGULAR_FILE;
45 entry->name = info.GetName().AsUTF8Unsafe(); 45 entry->name = info.GetName().AsUTF8Unsafe();
46 entries.push_back(std::move(entry)); 46 entries.push_back(std::move(entry));
47 } 47 }
48 48
49 callback.Run(FileError::OK, std::move(entries)); 49 callback.Run(mojom::FileError::OK, std::move(entries));
50 } 50 }
51 51
52 // TODO(erg): Consider adding an implementation of Stat()/Touch() to the 52 // TODO(erg): Consider adding an implementation of Stat()/Touch() to the
53 // directory, too. Right now, the base::File abstractions do not really deal 53 // directory, too. Right now, the base::File abstractions do not really deal
54 // with directories properly, so these are broken for now. 54 // with directories properly, so these are broken for now.
55 55
56 // TODO(vtl): Move the implementation to a thread pool. 56 // TODO(vtl): Move the implementation to a thread pool.
57 void DirectoryImpl::OpenFile(const mojo::String& raw_path, 57 void DirectoryImpl::OpenFile(const mojo::String& raw_path,
58 mojo::InterfaceRequest<File> file, 58 mojo::InterfaceRequest<mojom::File> file,
59 uint32_t open_flags, 59 uint32_t open_flags,
60 const OpenFileCallback& callback) { 60 const OpenFileCallback& callback) {
61 base::FilePath path; 61 base::FilePath path;
62 FileError error = ValidatePath(raw_path, directory_path_, &path); 62 mojom::FileError error = ValidatePath(raw_path, directory_path_, &path);
63 if (error != FileError::OK) { 63 if (error != mojom::FileError::OK) {
64 callback.Run(error); 64 callback.Run(error);
65 return; 65 return;
66 } 66 }
67 67
68 if (base::DirectoryExists(path)) { 68 if (base::DirectoryExists(path)) {
69 // We must not return directories as files. In the file abstraction, we can 69 // We must not return directories as files. In the file abstraction, we can
70 // fetch raw file descriptors over mojo pipes, and passing a file 70 // fetch raw file descriptors over mojo pipes, and passing a file
71 // descriptor to a directory is a sandbox escape on Windows. 71 // descriptor to a directory is a sandbox escape on Windows.
72 callback.Run(FileError::NOT_A_FILE); 72 callback.Run(mojom::FileError::NOT_A_FILE);
73 return; 73 return;
74 } 74 }
75 75
76 base::File base_file(path, open_flags); 76 base::File base_file(path, open_flags);
77 if (!base_file.IsValid()) { 77 if (!base_file.IsValid()) {
78 callback.Run(GetError(base_file)); 78 callback.Run(GetError(base_file));
79 return; 79 return;
80 } 80 }
81 81
82 if (file.is_pending()) { 82 if (file.is_pending()) {
83 new FileImpl(std::move(file), path, std::move(base_file), temp_dir_, 83 new FileImpl(std::move(file), path, std::move(base_file), temp_dir_,
84 lock_table_); 84 lock_table_);
85 } 85 }
86 callback.Run(FileError::OK); 86 callback.Run(mojom::FileError::OK);
87 } 87 }
88 88
89 void DirectoryImpl::OpenFileHandle(const mojo::String& raw_path, 89 void DirectoryImpl::OpenFileHandle(const mojo::String& raw_path,
90 uint32_t open_flags, 90 uint32_t open_flags,
91 const OpenFileHandleCallback& callback) { 91 const OpenFileHandleCallback& callback) {
92 FileError error = FileError::OK; 92 mojom::FileError error = mojom::FileError::OK;
93 mojo::ScopedHandle handle = OpenFileHandleImpl(raw_path, open_flags, &error); 93 mojo::ScopedHandle handle = OpenFileHandleImpl(raw_path, open_flags, &error);
94 callback.Run(error, std::move(handle)); 94 callback.Run(error, std::move(handle));
95 } 95 }
96 96
97 void DirectoryImpl::OpenFileHandles(mojo::Array<FileOpenDetailsPtr> details, 97 void DirectoryImpl::OpenFileHandles(
98 const OpenFileHandlesCallback& callback) { 98 mojo::Array<mojom::FileOpenDetailsPtr> details,
99 mojo::Array<FileOpenResultPtr> results( 99 const OpenFileHandlesCallback& callback) {
100 mojo::Array<FileOpenResultPtr>::New(details.size())); 100 mojo::Array<mojom::FileOpenResultPtr> results(
101 mojo::Array<mojom::FileOpenResultPtr>::New(details.size()));
101 size_t i = 0; 102 size_t i = 0;
102 for (const auto& detail : details) { 103 for (const auto& detail : details) {
103 FileOpenResultPtr result(FileOpenResult::New()); 104 mojom::FileOpenResultPtr result(mojom::FileOpenResult::New());
104 result->path = detail->path; 105 result->path = detail->path;
105 result->file_handle = 106 result->file_handle =
106 OpenFileHandleImpl(detail->path, detail->open_flags, &result->error); 107 OpenFileHandleImpl(detail->path, detail->open_flags, &result->error);
107 results[i++] = std::move(result); 108 results[i++] = std::move(result);
108 } 109 }
109 callback.Run(std::move(results)); 110 callback.Run(std::move(results));
110 } 111 }
111 112
112 void DirectoryImpl::OpenDirectory(const mojo::String& raw_path, 113 void DirectoryImpl::OpenDirectory(
113 mojo::InterfaceRequest<Directory> directory, 114 const mojo::String& raw_path,
114 uint32_t open_flags, 115 mojo::InterfaceRequest<mojom::Directory> directory,
115 const OpenDirectoryCallback& callback) { 116 uint32_t open_flags,
117 const OpenDirectoryCallback& callback) {
116 base::FilePath path; 118 base::FilePath path;
117 FileError error = ValidatePath(raw_path, directory_path_, &path); 119 mojom::FileError error = ValidatePath(raw_path, directory_path_, &path);
118 if (error != FileError::OK) { 120 if (error != mojom::FileError::OK) {
119 callback.Run(error); 121 callback.Run(error);
120 return; 122 return;
121 } 123 }
122 124
123 if (!base::DirectoryExists(path)) { 125 if (!base::DirectoryExists(path)) {
124 if (base::PathExists(path)) { 126 if (base::PathExists(path)) {
125 callback.Run(FileError::NOT_A_DIRECTORY); 127 callback.Run(mojom::FileError::NOT_A_DIRECTORY);
126 return; 128 return;
127 } 129 }
128 130
129 if (!(open_flags & kFlagOpenAlways || open_flags & kFlagCreate)) { 131 if (!(open_flags & mojom::kFlagOpenAlways ||
132 open_flags & mojom::kFlagCreate)) {
130 // The directory doesn't exist, and we weren't passed parameters to 133 // The directory doesn't exist, and we weren't passed parameters to
131 // create it. 134 // create it.
132 callback.Run(FileError::NOT_FOUND); 135 callback.Run(mojom::FileError::NOT_FOUND);
133 return; 136 return;
134 } 137 }
135 138
136 base::File::Error error; 139 base::File::Error error;
137 if (!base::CreateDirectoryAndGetError(path, &error)) { 140 if (!base::CreateDirectoryAndGetError(path, &error)) {
138 callback.Run(static_cast<filesystem::FileError>(error)); 141 callback.Run(static_cast<filesystem::mojom::FileError>(error));
139 return; 142 return;
140 } 143 }
141 } 144 }
142 145
143 if (directory.is_pending()) 146 if (directory.is_pending())
144 new DirectoryImpl(std::move(directory), path, temp_dir_, lock_table_); 147 new DirectoryImpl(std::move(directory), path, temp_dir_, lock_table_);
145 callback.Run(FileError::OK); 148 callback.Run(mojom::FileError::OK);
146 } 149 }
147 150
148 void DirectoryImpl::Rename(const mojo::String& raw_old_path, 151 void DirectoryImpl::Rename(const mojo::String& raw_old_path,
149 const mojo::String& raw_new_path, 152 const mojo::String& raw_new_path,
150 const RenameCallback& callback) { 153 const RenameCallback& callback) {
151 base::FilePath old_path; 154 base::FilePath old_path;
152 FileError error = ValidatePath(raw_old_path, directory_path_, &old_path); 155 mojom::FileError error =
153 if (error != FileError::OK) { 156 ValidatePath(raw_old_path, directory_path_, &old_path);
157 if (error != mojom::FileError::OK) {
154 callback.Run(error); 158 callback.Run(error);
155 return; 159 return;
156 } 160 }
157 161
158 base::FilePath new_path; 162 base::FilePath new_path;
159 error = ValidatePath(raw_new_path, directory_path_, &new_path); 163 error = ValidatePath(raw_new_path, directory_path_, &new_path);
160 if (error != FileError::OK) { 164 if (error != mojom::FileError::OK) {
161 callback.Run(error); 165 callback.Run(error);
162 return; 166 return;
163 } 167 }
164 168
165 if (!base::Move(old_path, new_path)) { 169 if (!base::Move(old_path, new_path)) {
166 callback.Run(FileError::FAILED); 170 callback.Run(mojom::FileError::FAILED);
167 return; 171 return;
168 } 172 }
169 173
170 callback.Run(FileError::OK); 174 callback.Run(mojom::FileError::OK);
171 } 175 }
172 176
173 void DirectoryImpl::Delete(const mojo::String& raw_path, 177 void DirectoryImpl::Delete(const mojo::String& raw_path,
174 uint32_t delete_flags, 178 uint32_t delete_flags,
175 const DeleteCallback& callback) { 179 const DeleteCallback& callback) {
176 base::FilePath path; 180 base::FilePath path;
177 FileError error = ValidatePath(raw_path, directory_path_, &path); 181 mojom::FileError error = ValidatePath(raw_path, directory_path_, &path);
178 if (error != FileError::OK) { 182 if (error != mojom::FileError::OK) {
179 callback.Run(error); 183 callback.Run(error);
180 return; 184 return;
181 } 185 }
182 186
183 bool recursive = delete_flags & kDeleteFlagRecursive; 187 bool recursive = delete_flags & mojom::kDeleteFlagRecursive;
184 if (!base::DeleteFile(path, recursive)) { 188 if (!base::DeleteFile(path, recursive)) {
185 callback.Run(FileError::FAILED); 189 callback.Run(mojom::FileError::FAILED);
186 return; 190 return;
187 } 191 }
188 192
189 callback.Run(FileError::OK); 193 callback.Run(mojom::FileError::OK);
190 } 194 }
191 195
192 void DirectoryImpl::Exists(const mojo::String& raw_path, 196 void DirectoryImpl::Exists(const mojo::String& raw_path,
193 const ExistsCallback& callback) { 197 const ExistsCallback& callback) {
194 base::FilePath path; 198 base::FilePath path;
195 FileError error = ValidatePath(raw_path, directory_path_, &path); 199 mojom::FileError error = ValidatePath(raw_path, directory_path_, &path);
196 if (error != FileError::OK) { 200 if (error != mojom::FileError::OK) {
197 callback.Run(error, false); 201 callback.Run(error, false);
198 return; 202 return;
199 } 203 }
200 204
201 bool exists = base::PathExists(path); 205 bool exists = base::PathExists(path);
202 callback.Run(FileError::OK, exists); 206 callback.Run(mojom::FileError::OK, exists);
203 } 207 }
204 208
205 void DirectoryImpl::IsWritable(const mojo::String& raw_path, 209 void DirectoryImpl::IsWritable(const mojo::String& raw_path,
206 const IsWritableCallback& callback) { 210 const IsWritableCallback& callback) {
207 base::FilePath path; 211 base::FilePath path;
208 FileError error = ValidatePath(raw_path, directory_path_, &path); 212 mojom::FileError error = ValidatePath(raw_path, directory_path_, &path);
209 if (error != FileError::OK) { 213 if (error != mojom::FileError::OK) {
210 callback.Run(error, false); 214 callback.Run(error, false);
211 return; 215 return;
212 } 216 }
213 217
214 callback.Run(FileError::OK, base::PathIsWritable(path)); 218 callback.Run(mojom::FileError::OK, base::PathIsWritable(path));
215 } 219 }
216 220
217 void DirectoryImpl::Flush(const FlushCallback& callback) { 221 void DirectoryImpl::Flush(const FlushCallback& callback) {
218 base::File file(directory_path_, base::File::FLAG_READ); 222 base::File file(directory_path_, base::File::FLAG_READ);
219 if (!file.IsValid()) { 223 if (!file.IsValid()) {
220 callback.Run(GetError(file)); 224 callback.Run(GetError(file));
221 return; 225 return;
222 } 226 }
223 227
224 if (!file.Flush()) { 228 if (!file.Flush()) {
225 callback.Run(FileError::FAILED); 229 callback.Run(mojom::FileError::FAILED);
226 return; 230 return;
227 } 231 }
228 232
229 callback.Run(FileError::OK); 233 callback.Run(mojom::FileError::OK);
230 } 234 }
231 235
232 void DirectoryImpl::StatFile(const mojo::String& raw_path, 236 void DirectoryImpl::StatFile(const mojo::String& raw_path,
233 const StatFileCallback& callback) { 237 const StatFileCallback& callback) {
234 base::FilePath path; 238 base::FilePath path;
235 FileError error = ValidatePath(raw_path, directory_path_, &path); 239 mojom::FileError error = ValidatePath(raw_path, directory_path_, &path);
236 if (error != FileError::OK) { 240 if (error != mojom::FileError::OK) {
237 callback.Run(error, nullptr); 241 callback.Run(error, nullptr);
238 return; 242 return;
239 } 243 }
240 244
241 base::File base_file(path, base::File::FLAG_OPEN | base::File::FLAG_READ); 245 base::File base_file(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
242 if (!base_file.IsValid()) { 246 if (!base_file.IsValid()) {
243 callback.Run(GetError(base_file), nullptr); 247 callback.Run(GetError(base_file), nullptr);
244 return; 248 return;
245 } 249 }
246 250
247 base::File::Info info; 251 base::File::Info info;
248 if (!base_file.GetInfo(&info)) { 252 if (!base_file.GetInfo(&info)) {
249 callback.Run(FileError::FAILED, nullptr); 253 callback.Run(mojom::FileError::FAILED, nullptr);
250 return; 254 return;
251 } 255 }
252 256
253 callback.Run(FileError::OK, MakeFileInformation(info)); 257 callback.Run(mojom::FileError::OK, MakeFileInformation(info));
254 } 258 }
255 259
256 void DirectoryImpl::Clone(mojo::InterfaceRequest<Directory> directory) { 260 void DirectoryImpl::Clone(mojo::InterfaceRequest<mojom::Directory> directory) {
257 if (directory.is_pending()) { 261 if (directory.is_pending()) {
258 new DirectoryImpl(std::move(directory), directory_path_, 262 new DirectoryImpl(std::move(directory), directory_path_,
259 temp_dir_, lock_table_); 263 temp_dir_, lock_table_);
260 } 264 }
261 } 265 }
262 266
263 void DirectoryImpl::ReadEntireFile(const mojo::String& raw_path, 267 void DirectoryImpl::ReadEntireFile(const mojo::String& raw_path,
264 const ReadEntireFileCallback& callback) { 268 const ReadEntireFileCallback& callback) {
265 base::FilePath path; 269 base::FilePath path;
266 FileError error = ValidatePath(raw_path, directory_path_, &path); 270 mojom::FileError error = ValidatePath(raw_path, directory_path_, &path);
267 if (error != FileError::OK) { 271 if (error != mojom::FileError::OK) {
268 callback.Run(error, mojo::Array<uint8_t>()); 272 callback.Run(error, mojo::Array<uint8_t>());
269 return; 273 return;
270 } 274 }
271 275
272 if (base::DirectoryExists(path)) { 276 if (base::DirectoryExists(path)) {
273 callback.Run(FileError::NOT_A_FILE, mojo::Array<uint8_t>()); 277 callback.Run(mojom::FileError::NOT_A_FILE, mojo::Array<uint8_t>());
274 return; 278 return;
275 } 279 }
276 280
277 base::File base_file(path, base::File::FLAG_OPEN | base::File::FLAG_READ); 281 base::File base_file(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
278 if (!base_file.IsValid()) { 282 if (!base_file.IsValid()) {
279 callback.Run(GetError(base_file), mojo::Array<uint8_t>()); 283 callback.Run(GetError(base_file), mojo::Array<uint8_t>());
280 return; 284 return;
281 } 285 }
282 286
283 std::string contents; 287 std::string contents;
284 const int kBufferSize = 1 << 16; 288 const int kBufferSize = 1 << 16;
285 std::unique_ptr<char[]> buf(new char[kBufferSize]); 289 std::unique_ptr<char[]> buf(new char[kBufferSize]);
286 int len; 290 int len;
287 while ((len = base_file.ReadAtCurrentPos(buf.get(), kBufferSize)) > 0) 291 while ((len = base_file.ReadAtCurrentPos(buf.get(), kBufferSize)) > 0)
288 contents.append(buf.get(), len); 292 contents.append(buf.get(), len);
289 293
290 callback.Run(FileError::OK, mojo::Array<uint8_t>::From(contents)); 294 callback.Run(mojom::FileError::OK, mojo::Array<uint8_t>::From(contents));
291 } 295 }
292 296
293 void DirectoryImpl::WriteFile(const mojo::String& raw_path, 297 void DirectoryImpl::WriteFile(const mojo::String& raw_path,
294 mojo::Array<uint8_t> data, 298 mojo::Array<uint8_t> data,
295 const WriteFileCallback& callback) { 299 const WriteFileCallback& callback) {
296 base::FilePath path; 300 base::FilePath path;
297 FileError error = ValidatePath(raw_path, directory_path_, &path); 301 mojom::FileError error = ValidatePath(raw_path, directory_path_, &path);
298 if (error != FileError::OK) { 302 if (error != mojom::FileError::OK) {
299 callback.Run(error); 303 callback.Run(error);
300 return; 304 return;
301 } 305 }
302 306
303 if (base::DirectoryExists(path)) { 307 if (base::DirectoryExists(path)) {
304 callback.Run(FileError::NOT_A_FILE); 308 callback.Run(mojom::FileError::NOT_A_FILE);
305 return; 309 return;
306 } 310 }
307 311
308 base::File base_file(path, 312 base::File base_file(path,
309 base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); 313 base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
310 if (!base_file.IsValid()) { 314 if (!base_file.IsValid()) {
311 callback.Run(GetError(base_file)); 315 callback.Run(GetError(base_file));
312 return; 316 return;
313 } 317 }
314 318
315 // If we're given empty data, we don't write and just truncate the file. 319 // If we're given empty data, we don't write and just truncate the file.
316 if (data.size()) { 320 if (data.size()) {
317 const int data_size = static_cast<int>(data.size()); 321 const int data_size = static_cast<int>(data.size());
318 if (base_file.Write(0, reinterpret_cast<char*>(&data.front()), 322 if (base_file.Write(0, reinterpret_cast<char*>(&data.front()),
319 data_size) == -1) { 323 data_size) == -1) {
320 callback.Run(GetError(base_file)); 324 callback.Run(GetError(base_file));
321 return; 325 return;
322 } 326 }
323 } 327 }
324 328
325 callback.Run(FileError::OK); 329 callback.Run(mojom::FileError::OK);
326 } 330 }
327 331
328 mojo::ScopedHandle DirectoryImpl::OpenFileHandleImpl( 332 mojo::ScopedHandle DirectoryImpl::OpenFileHandleImpl(
329 const mojo::String& raw_path, 333 const mojo::String& raw_path,
330 uint32_t open_flags, 334 uint32_t open_flags,
331 FileError* error) { 335 mojom::FileError* error) {
332 base::FilePath path; 336 base::FilePath path;
333 *error = ValidatePath(raw_path, directory_path_, &path); 337 *error = ValidatePath(raw_path, directory_path_, &path);
334 if (*error != FileError::OK) 338 if (*error != mojom::FileError::OK)
335 return mojo::ScopedHandle(); 339 return mojo::ScopedHandle();
336 340
337 if (base::DirectoryExists(path)) { 341 if (base::DirectoryExists(path)) {
338 // We must not return directories as files. In the file abstraction, we 342 // We must not return directories as files. In the file abstraction, we
339 // can fetch raw file descriptors over mojo pipes, and passing a file 343 // can fetch raw file descriptors over mojo pipes, and passing a file
340 // descriptor to a directory is a sandbox escape on Windows. 344 // descriptor to a directory is a sandbox escape on Windows.
341 *error = FileError::NOT_A_FILE; 345 *error = mojom::FileError::NOT_A_FILE;
342 return mojo::ScopedHandle(); 346 return mojo::ScopedHandle();
343 } 347 }
344 348
345 base::File base_file(path, open_flags); 349 base::File base_file(path, open_flags);
346 if (!base_file.IsValid()) { 350 if (!base_file.IsValid()) {
347 *error = GetError(base_file); 351 *error = GetError(base_file);
348 return mojo::ScopedHandle(); 352 return mojo::ScopedHandle();
349 } 353 }
350 354
351 MojoHandle mojo_handle; 355 MojoHandle mojo_handle;
352 MojoResult create_result = MojoCreatePlatformHandleWrapper( 356 MojoResult create_result = MojoCreatePlatformHandleWrapper(
353 base_file.TakePlatformFile(), &mojo_handle); 357 base_file.TakePlatformFile(), &mojo_handle);
354 if (create_result != MOJO_RESULT_OK) { 358 if (create_result != MOJO_RESULT_OK) {
355 *error = FileError::FAILED; 359 *error = mojom::FileError::FAILED;
356 return mojo::ScopedHandle(); 360 return mojo::ScopedHandle();
357 } 361 }
358 362
359 *error = FileError::OK; 363 *error = mojom::FileError::OK;
360 return mojo::ScopedHandle(mojo::Handle(mojo_handle)); 364 return mojo::ScopedHandle(mojo::Handle(mojo_handle));
361 } 365 }
362 366
363 } // namespace filesystem 367 } // namespace filesystem
OLDNEW
« no previous file with comments | « components/filesystem/directory_impl.h ('k') | components/filesystem/directory_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698