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

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

Issue 1942473002: Eliminate mojo:resource_provider (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
« no previous file with comments | « components/filesystem/directory_impl.h ('k') | components/filesystem/filesystem.gyp » ('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 <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 using mojo::ScopedHandle;
22
23 namespace filesystem { 21 namespace filesystem {
24 22
25 DirectoryImpl::DirectoryImpl(mojo::InterfaceRequest<Directory> request, 23 DirectoryImpl::DirectoryImpl(mojo::InterfaceRequest<Directory> request,
26 base::FilePath directory_path, 24 base::FilePath directory_path,
27 scoped_refptr<SharedTempDir> temp_dir, 25 scoped_refptr<SharedTempDir> temp_dir,
28 scoped_refptr<LockTable> lock_table) 26 scoped_refptr<LockTable> lock_table)
29 : binding_(this, std::move(request)), 27 : binding_(this, std::move(request)),
30 directory_path_(directory_path), 28 directory_path_(directory_path),
31 temp_dir_(std::move(temp_dir)), 29 temp_dir_(std::move(temp_dir)),
32 lock_table_(std::move(lock_table)) {} 30 lock_table_(std::move(lock_table)) {}
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 if (file.is_pending()) { 82 if (file.is_pending()) {
85 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_,
86 lock_table_); 84 lock_table_);
87 } 85 }
88 callback.Run(FileError::OK); 86 callback.Run(FileError::OK);
89 } 87 }
90 88
91 void DirectoryImpl::OpenFileHandle(const mojo::String& raw_path, 89 void DirectoryImpl::OpenFileHandle(const mojo::String& raw_path,
92 uint32_t open_flags, 90 uint32_t open_flags,
93 const OpenFileHandleCallback& callback) { 91 const OpenFileHandleCallback& callback) {
94 base::FilePath path; 92 FileError error = FileError::OK;
95 FileError error = ValidatePath(raw_path, directory_path_, &path); 93 mojo::ScopedHandle handle = OpenFileHandleImpl(raw_path, open_flags, &error);
96 if (error != FileError::OK) { 94 callback.Run(error, std::move(handle));
97 callback.Run(error, ScopedHandle()); 95 }
98 return; 96
97 void DirectoryImpl::OpenFileHandles(mojo::Array<FileOpenDetailsPtr> details,
98 const OpenFileHandlesCallback& callback) {
99 mojo::Array<FileOpenResultPtr> results(
100 mojo::Array<FileOpenResultPtr>::New(details.size()));
101 size_t i = 0;
102 for (const auto& detail : details) {
103 FileOpenResultPtr result(FileOpenResult::New());
104 result->path = detail->path;
105 result->file_handle =
106 OpenFileHandleImpl(detail->path, detail->open_flags, &result->error);
107 results[i++] = std::move(result);
99 } 108 }
100 109 callback.Run(std::move(results));
101 if (base::DirectoryExists(path)) {
102 // We must not return directories as files. In the file abstraction, we can
103 // fetch raw file descriptors over mojo pipes, and passing a file
104 // descriptor to a directory is a sandbox escape on Windows.
105 callback.Run(FileError::NOT_A_FILE, ScopedHandle());
106 return;
107 }
108
109 base::File base_file(path, open_flags);
110 if (!base_file.IsValid()) {
111 callback.Run(GetError(base_file), ScopedHandle());
112 return;
113 }
114
115 MojoHandle mojo_handle;
116 MojoResult create_result = MojoCreatePlatformHandleWrapper(
117 base_file.TakePlatformFile(), &mojo_handle);
118 if (create_result != MOJO_RESULT_OK) {
119 callback.Run(FileError::FAILED, ScopedHandle());
120 return;
121 }
122
123 callback.Run(FileError::OK, ScopedHandle(mojo::Handle(mojo_handle)));
124 } 110 }
125 111
126 void DirectoryImpl::OpenDirectory(const mojo::String& raw_path, 112 void DirectoryImpl::OpenDirectory(const mojo::String& raw_path,
127 mojo::InterfaceRequest<Directory> directory, 113 mojo::InterfaceRequest<Directory> directory,
128 uint32_t open_flags, 114 uint32_t open_flags,
129 const OpenDirectoryCallback& callback) { 115 const OpenDirectoryCallback& callback) {
130 base::FilePath path; 116 base::FilePath path;
131 FileError error = ValidatePath(raw_path, directory_path_, &path); 117 FileError error = ValidatePath(raw_path, directory_path_, &path);
132 if (error != FileError::OK) { 118 if (error != FileError::OK) {
133 callback.Run(error); 119 callback.Run(error);
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 if (base_file.Write(0, reinterpret_cast<char*>(&data.front()), 318 if (base_file.Write(0, reinterpret_cast<char*>(&data.front()),
333 data_size) == -1) { 319 data_size) == -1) {
334 callback.Run(GetError(base_file)); 320 callback.Run(GetError(base_file));
335 return; 321 return;
336 } 322 }
337 } 323 }
338 324
339 callback.Run(FileError::OK); 325 callback.Run(FileError::OK);
340 } 326 }
341 327
328 mojo::ScopedHandle DirectoryImpl::OpenFileHandleImpl(
329 const mojo::String& raw_path,
330 uint32_t open_flags,
331 FileError* error) {
332 base::FilePath path;
333 *error = ValidatePath(raw_path, directory_path_, &path);
334 if (*error != FileError::OK)
335 return mojo::ScopedHandle();
336
337 if (base::DirectoryExists(path)) {
338 // 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
340 // descriptor to a directory is a sandbox escape on Windows.
341 *error = FileError::NOT_A_FILE;
342 return mojo::ScopedHandle();
343 }
344
345 base::File base_file(path, open_flags);
346 if (!base_file.IsValid()) {
347 *error = GetError(base_file);
348 return mojo::ScopedHandle();
349 }
350
351 MojoHandle mojo_handle;
352 MojoResult create_result = MojoCreatePlatformHandleWrapper(
353 base_file.TakePlatformFile(), &mojo_handle);
354 if (create_result != MOJO_RESULT_OK) {
355 *error = FileError::FAILED;
356 return mojo::ScopedHandle();
357 }
358
359 *error = FileError::OK;
360 return mojo::ScopedHandle(mojo::Handle(mojo_handle));
361 }
362
342 } // namespace filesystem 363 } // namespace filesystem
OLDNEW
« no previous file with comments | « components/filesystem/directory_impl.h ('k') | components/filesystem/filesystem.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698