Commit eee70496 authored by Ken Rockot's avatar Ken Rockot Committed by Commit Bot

Convert file/filesystem services to new Mojo types

Bug: 955171
Change-Id: I66e911a8444621a4342ecfd77787704a63529672
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1632895Reviewed-by: default avatarTom Sepez <tsepez@chromium.org>
Reviewed-by: default avatarMarijn Kruisselbrink <mek@chromium.org>
Commit-Queue: Ken Rockot <rockot@google.com>
Cr-Commit-Position: refs/heads/master@{#664405}
parent 53dfd8ca
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#include "components/services/filesystem/file_impl.h" #include "components/services/filesystem/file_impl.h"
#include "components/services/filesystem/lock_table.h" #include "components/services/filesystem/lock_table.h"
#include "components/services/filesystem/util.h" #include "components/services/filesystem/util.h"
#include "mojo/public/cpp/bindings/strong_binding.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h"
namespace filesystem { namespace filesystem {
...@@ -58,7 +58,7 @@ void DirectoryImpl::Read(ReadCallback callback) { ...@@ -58,7 +58,7 @@ void DirectoryImpl::Read(ReadCallback callback) {
// TODO(vtl): Move the implementation to a thread pool. // TODO(vtl): Move the implementation to a thread pool.
void DirectoryImpl::OpenFile(const std::string& raw_path, void DirectoryImpl::OpenFile(const std::string& raw_path,
mojom::FileRequest file, mojo::PendingReceiver<mojom::File> receiver,
uint32_t open_flags, uint32_t open_flags,
OpenFileCallback callback) { OpenFileCallback callback) {
base::FilePath path; base::FilePath path;
...@@ -82,11 +82,11 @@ void DirectoryImpl::OpenFile(const std::string& raw_path, ...@@ -82,11 +82,11 @@ void DirectoryImpl::OpenFile(const std::string& raw_path,
return; return;
} }
if (file.is_pending()) { if (receiver) {
mojo::MakeStrongBinding( mojo::MakeSelfOwnedReceiver(
std::make_unique<FileImpl>(path, std::move(base_file), temp_dir_, std::make_unique<FileImpl>(path, std::move(base_file), temp_dir_,
lock_table_), lock_table_),
std::move(file)); std::move(receiver));
} }
std::move(callback).Run(base::File::Error::FILE_OK); std::move(callback).Run(base::File::Error::FILE_OK);
} }
...@@ -114,10 +114,11 @@ void DirectoryImpl::OpenFileHandles( ...@@ -114,10 +114,11 @@ void DirectoryImpl::OpenFileHandles(
std::move(callback).Run(std::move(results)); std::move(callback).Run(std::move(results));
} }
void DirectoryImpl::OpenDirectory(const std::string& raw_path, void DirectoryImpl::OpenDirectory(
mojom::DirectoryRequest directory, const std::string& raw_path,
uint32_t open_flags, mojo::PendingReceiver<mojom::Directory> receiver,
OpenDirectoryCallback callback) { uint32_t open_flags,
OpenDirectoryCallback callback) {
base::FilePath path; base::FilePath path;
base::File::Error error = ValidatePath(raw_path, directory_path_, &path); base::File::Error error = ValidatePath(raw_path, directory_path_, &path);
if (error != base::File::Error::FILE_OK) { if (error != base::File::Error::FILE_OK) {
...@@ -146,10 +147,10 @@ void DirectoryImpl::OpenDirectory(const std::string& raw_path, ...@@ -146,10 +147,10 @@ void DirectoryImpl::OpenDirectory(const std::string& raw_path,
} }
} }
if (directory.is_pending()) { if (receiver) {
mojo::MakeStrongBinding( mojo::MakeSelfOwnedReceiver(
std::make_unique<DirectoryImpl>(path, temp_dir_, lock_table_), std::make_unique<DirectoryImpl>(path, temp_dir_, lock_table_),
std::move(directory)); std::move(receiver));
} }
std::move(callback).Run(base::File::Error::FILE_OK); std::move(callback).Run(base::File::Error::FILE_OK);
...@@ -297,12 +298,10 @@ void DirectoryImpl::StatFile(const std::string& raw_path, ...@@ -297,12 +298,10 @@ void DirectoryImpl::StatFile(const std::string& raw_path,
MakeFileInformation(info)); MakeFileInformation(info));
} }
void DirectoryImpl::Clone(mojom::DirectoryRequest directory) { void DirectoryImpl::Clone(mojo::PendingReceiver<mojom::Directory> receiver) {
if (directory.is_pending()) { mojo::MakeSelfOwnedReceiver(
mojo::MakeStrongBinding(std::make_unique<DirectoryImpl>( std::make_unique<DirectoryImpl>(directory_path_, temp_dir_, lock_table_),
directory_path_, temp_dir_, lock_table_), std::move(receiver));
std::move(directory));
}
} }
void DirectoryImpl::ReadEntireFile(const std::string& raw_path, void DirectoryImpl::ReadEntireFile(const std::string& raw_path,
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
#include "base/macros.h" #include "base/macros.h"
#include "components/services/filesystem/public/interfaces/directory.mojom.h" #include "components/services/filesystem/public/interfaces/directory.mojom.h"
#include "components/services/filesystem/shared_temp_dir.h" #include "components/services/filesystem/shared_temp_dir.h"
#include "mojo/public/cpp/bindings/interface_request.h"
namespace filesystem { namespace filesystem {
...@@ -32,7 +31,7 @@ class DirectoryImpl : public mojom::Directory { ...@@ -32,7 +31,7 @@ class DirectoryImpl : public mojom::Directory {
// |Directory| implementation: // |Directory| implementation:
void Read(ReadCallback callback) override; void Read(ReadCallback callback) override;
void OpenFile(const std::string& path, void OpenFile(const std::string& path,
mojom::FileRequest file, mojo::PendingReceiver<mojom::File> receiver,
uint32_t open_flags, uint32_t open_flags,
OpenFileCallback callback) override; OpenFileCallback callback) override;
void OpenFileHandle(const std::string& path, void OpenFileHandle(const std::string& path,
...@@ -41,7 +40,7 @@ class DirectoryImpl : public mojom::Directory { ...@@ -41,7 +40,7 @@ class DirectoryImpl : public mojom::Directory {
void OpenFileHandles(std::vector<mojom::FileOpenDetailsPtr> details, void OpenFileHandles(std::vector<mojom::FileOpenDetailsPtr> details,
OpenFileHandlesCallback callback) override; OpenFileHandlesCallback callback) override;
void OpenDirectory(const std::string& path, void OpenDirectory(const std::string& path,
mojom::DirectoryRequest directory, mojo::PendingReceiver<mojom::Directory> receiver,
uint32_t open_flags, uint32_t open_flags,
OpenDirectoryCallback callback) override; OpenDirectoryCallback callback) override;
void Rename(const std::string& path, void Rename(const std::string& path,
...@@ -58,7 +57,7 @@ class DirectoryImpl : public mojom::Directory { ...@@ -58,7 +57,7 @@ class DirectoryImpl : public mojom::Directory {
IsWritableCallback callback) override; IsWritableCallback callback) override;
void Flush(FlushCallback callback) override; void Flush(FlushCallback callback) override;
void StatFile(const std::string& path, StatFileCallback callback) override; void StatFile(const std::string& path, StatFileCallback callback) override;
void Clone(mojom::DirectoryRequest directory) override; void Clone(mojo::PendingReceiver<mojom::Directory> receiver) override;
void ReadEntireFile(const std::string& path, void ReadEntireFile(const std::string& path,
ReadEntireFileCallback callback) override; ReadEntireFileCallback callback) override;
void WriteFile(const std::string& path, void WriteFile(const std::string& path,
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#include "base/stl_util.h" #include "base/stl_util.h"
#include "components/services/filesystem/files_test_base.h" #include "components/services/filesystem/files_test_base.h"
#include "components/services/filesystem/public/interfaces/directory.mojom.h" #include "components/services/filesystem/public/interfaces/directory.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
namespace filesystem { namespace filesystem {
namespace { namespace {
...@@ -20,7 +22,7 @@ using DirectoryImplTest = FilesTestBase; ...@@ -20,7 +22,7 @@ using DirectoryImplTest = FilesTestBase;
constexpr char kData[] = "one two three"; constexpr char kData[] = "one two three";
TEST_F(DirectoryImplTest, Read) { TEST_F(DirectoryImplTest, Read) {
mojom::DirectoryPtr directory; mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory); GetTemporaryRoot(&directory);
base::File::Error error; base::File::Error error;
...@@ -34,15 +36,16 @@ TEST_F(DirectoryImplTest, Read) { ...@@ -34,15 +36,16 @@ TEST_F(DirectoryImplTest, Read) {
{"my_file3", mojom::kFlagAppend | mojom::kFlagCreate}}; {"my_file3", mojom::kFlagAppend | mojom::kFlagCreate}};
for (size_t i = 0; i < base::size(files_to_create); i++) { for (size_t i = 0; i < base::size(files_to_create); i++) {
error = base::File::Error::FILE_ERROR_FAILED; error = base::File::Error::FILE_ERROR_FAILED;
bool handled = directory->OpenFile(files_to_create[i].name, nullptr, bool handled =
files_to_create[i].open_flags, &error); directory->OpenFile(files_to_create[i].name, mojo::NullReceiver(),
files_to_create[i].open_flags, &error);
ASSERT_TRUE(handled); ASSERT_TRUE(handled);
EXPECT_EQ(base::File::Error::FILE_OK, error); EXPECT_EQ(base::File::Error::FILE_OK, error);
} }
// Make a directory. // Make a directory.
error = base::File::Error::FILE_ERROR_FAILED; error = base::File::Error::FILE_ERROR_FAILED;
bool handled = directory->OpenDirectory( bool handled = directory->OpenDirectory(
"my_dir", nullptr, "my_dir", mojo::NullReceiver(),
mojom::kFlagRead | mojom::kFlagWrite | mojom::kFlagCreate, &error); mojom::kFlagRead | mojom::kFlagWrite | mojom::kFlagCreate, &error);
ASSERT_TRUE(handled); ASSERT_TRUE(handled);
EXPECT_EQ(base::File::Error::FILE_OK, error); EXPECT_EQ(base::File::Error::FILE_OK, error);
...@@ -76,20 +79,21 @@ TEST_F(DirectoryImplTest, Read) { ...@@ -76,20 +79,21 @@ TEST_F(DirectoryImplTest, Read) {
// TODO(vtl): Properly test OpenFile() and OpenDirectory() (including flags). // TODO(vtl): Properly test OpenFile() and OpenDirectory() (including flags).
TEST_F(DirectoryImplTest, BasicRenameDelete) { TEST_F(DirectoryImplTest, BasicRenameDelete) {
mojom::DirectoryPtr directory; mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory); GetTemporaryRoot(&directory);
base::File::Error error; base::File::Error error;
// Create my_file. // Create my_file.
error = base::File::Error::FILE_ERROR_FAILED; error = base::File::Error::FILE_ERROR_FAILED;
bool handled = directory->OpenFile( bool handled =
"my_file", nullptr, mojom::kFlagWrite | mojom::kFlagCreate, &error); directory->OpenFile("my_file", mojo::NullReceiver(),
mojom::kFlagWrite | mojom::kFlagCreate, &error);
ASSERT_TRUE(handled); ASSERT_TRUE(handled);
EXPECT_EQ(base::File::Error::FILE_OK, error); EXPECT_EQ(base::File::Error::FILE_OK, error);
// Opening my_file should succeed. // Opening my_file should succeed.
error = base::File::Error::FILE_ERROR_FAILED; error = base::File::Error::FILE_ERROR_FAILED;
handled = directory->OpenFile("my_file", nullptr, handled = directory->OpenFile("my_file", mojo::NullReceiver(),
mojom::kFlagRead | mojom::kFlagOpen, &error); mojom::kFlagRead | mojom::kFlagOpen, &error);
ASSERT_TRUE(handled); ASSERT_TRUE(handled);
EXPECT_EQ(base::File::Error::FILE_OK, error); EXPECT_EQ(base::File::Error::FILE_OK, error);
...@@ -102,14 +106,14 @@ TEST_F(DirectoryImplTest, BasicRenameDelete) { ...@@ -102,14 +106,14 @@ TEST_F(DirectoryImplTest, BasicRenameDelete) {
// Opening my_file should fail. // Opening my_file should fail.
error = base::File::Error::FILE_ERROR_FAILED; error = base::File::Error::FILE_ERROR_FAILED;
handled = directory->OpenFile("my_file", nullptr, handled = directory->OpenFile("my_file", mojo::NullReceiver(),
mojom::kFlagRead | mojom::kFlagOpen, &error); mojom::kFlagRead | mojom::kFlagOpen, &error);
ASSERT_TRUE(handled); ASSERT_TRUE(handled);
EXPECT_EQ(base::File::Error::FILE_ERROR_NOT_FOUND, error); EXPECT_EQ(base::File::Error::FILE_ERROR_NOT_FOUND, error);
// Opening my_new_file should succeed. // Opening my_new_file should succeed.
error = base::File::Error::FILE_ERROR_FAILED; error = base::File::Error::FILE_ERROR_FAILED;
handled = directory->OpenFile("my_new_file", nullptr, handled = directory->OpenFile("my_new_file", mojo::NullReceiver(),
mojom::kFlagRead | mojom::kFlagOpen, &error); mojom::kFlagRead | mojom::kFlagOpen, &error);
ASSERT_TRUE(handled); ASSERT_TRUE(handled);
EXPECT_EQ(base::File::Error::FILE_OK, error); EXPECT_EQ(base::File::Error::FILE_OK, error);
...@@ -121,23 +125,23 @@ TEST_F(DirectoryImplTest, BasicRenameDelete) { ...@@ -121,23 +125,23 @@ TEST_F(DirectoryImplTest, BasicRenameDelete) {
// Opening my_new_file should fail. // Opening my_new_file should fail.
error = base::File::Error::FILE_ERROR_FAILED; error = base::File::Error::FILE_ERROR_FAILED;
handled = directory->OpenFile("my_new_file", nullptr, handled = directory->OpenFile("my_new_file", mojo::NullReceiver(),
mojom::kFlagRead | mojom::kFlagOpen, &error); mojom::kFlagRead | mojom::kFlagOpen, &error);
ASSERT_TRUE(handled); ASSERT_TRUE(handled);
EXPECT_EQ(base::File::Error::FILE_ERROR_NOT_FOUND, error); EXPECT_EQ(base::File::Error::FILE_ERROR_NOT_FOUND, error);
} }
TEST_F(DirectoryImplTest, CantOpenDirectoriesAsFiles) { TEST_F(DirectoryImplTest, CantOpenDirectoriesAsFiles) {
mojom::DirectoryPtr directory; mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory); GetTemporaryRoot(&directory);
base::File::Error error; base::File::Error error;
{ {
// Create a directory called 'my_file' // Create a directory called 'my_file'
mojom::DirectoryPtr my_file_directory; mojo::Remote<mojom::Directory> my_file_directory;
error = base::File::Error::FILE_ERROR_FAILED; error = base::File::Error::FILE_ERROR_FAILED;
bool handled = directory->OpenDirectory( bool handled = directory->OpenDirectory(
"my_file", MakeRequest(&my_file_directory), "my_file", my_file_directory.BindNewPipeAndPassReceiver(),
mojom::kFlagRead | mojom::kFlagWrite | mojom::kFlagCreate, &error); mojom::kFlagRead | mojom::kFlagWrite | mojom::kFlagCreate, &error);
ASSERT_TRUE(handled); ASSERT_TRUE(handled);
EXPECT_EQ(base::File::Error::FILE_OK, error); EXPECT_EQ(base::File::Error::FILE_OK, error);
...@@ -145,10 +149,10 @@ TEST_F(DirectoryImplTest, CantOpenDirectoriesAsFiles) { ...@@ -145,10 +149,10 @@ TEST_F(DirectoryImplTest, CantOpenDirectoriesAsFiles) {
{ {
// Attempt to open that directory as a file. This must fail! // Attempt to open that directory as a file. This must fail!
mojom::FilePtr file; mojo::Remote<mojom::File> file;
error = base::File::Error::FILE_ERROR_FAILED; error = base::File::Error::FILE_ERROR_FAILED;
bool handled = bool handled =
directory->OpenFile("my_file", MakeRequest(&file), directory->OpenFile("my_file", file.BindNewPipeAndPassReceiver(),
mojom::kFlagRead | mojom::kFlagOpen, &error); mojom::kFlagRead | mojom::kFlagOpen, &error);
ASSERT_TRUE(handled); ASSERT_TRUE(handled);
EXPECT_EQ(base::File::Error::FILE_ERROR_NOT_A_FILE, error); EXPECT_EQ(base::File::Error::FILE_ERROR_NOT_A_FILE, error);
...@@ -156,16 +160,16 @@ TEST_F(DirectoryImplTest, CantOpenDirectoriesAsFiles) { ...@@ -156,16 +160,16 @@ TEST_F(DirectoryImplTest, CantOpenDirectoriesAsFiles) {
} }
TEST_F(DirectoryImplTest, Clone) { TEST_F(DirectoryImplTest, Clone) {
mojom::DirectoryPtr clone_one; mojo::Remote<mojom::Directory> clone_one;
mojom::DirectoryPtr clone_two; mojo::Remote<mojom::Directory> clone_two;
base::File::Error error; base::File::Error error;
{ {
mojom::DirectoryPtr directory; mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory); GetTemporaryRoot(&directory);
directory->Clone(MakeRequest(&clone_one)); directory->Clone(clone_one.BindNewPipeAndPassReceiver());
directory->Clone(MakeRequest(&clone_two)); directory->Clone(clone_two.BindNewPipeAndPassReceiver());
// Original temporary directory goes out of scope here; shouldn't be // Original temporary directory goes out of scope here; shouldn't be
// deleted since it has clones. // deleted since it has clones.
...@@ -189,7 +193,7 @@ TEST_F(DirectoryImplTest, Clone) { ...@@ -189,7 +193,7 @@ TEST_F(DirectoryImplTest, Clone) {
} }
TEST_F(DirectoryImplTest, WriteFileReadFile) { TEST_F(DirectoryImplTest, WriteFileReadFile) {
mojom::DirectoryPtr directory; mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory); GetTemporaryRoot(&directory);
base::File::Error error; base::File::Error error;
...@@ -211,7 +215,7 @@ TEST_F(DirectoryImplTest, WriteFileReadFile) { ...@@ -211,7 +215,7 @@ TEST_F(DirectoryImplTest, WriteFileReadFile) {
} }
TEST_F(DirectoryImplTest, ReadEmptyFileIsNotFoundError) { TEST_F(DirectoryImplTest, ReadEmptyFileIsNotFoundError) {
mojom::DirectoryPtr directory; mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory); GetTemporaryRoot(&directory);
base::File::Error error; base::File::Error error;
...@@ -225,16 +229,16 @@ TEST_F(DirectoryImplTest, ReadEmptyFileIsNotFoundError) { ...@@ -225,16 +229,16 @@ TEST_F(DirectoryImplTest, ReadEmptyFileIsNotFoundError) {
} }
TEST_F(DirectoryImplTest, CantReadEntireFileOnADirectory) { TEST_F(DirectoryImplTest, CantReadEntireFileOnADirectory) {
mojom::DirectoryPtr directory; mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory); GetTemporaryRoot(&directory);
base::File::Error error; base::File::Error error;
// Create a directory // Create a directory
{ {
mojom::DirectoryPtr my_file_directory; mojo::Remote<mojom::Directory> my_file_directory;
error = base::File::Error::FILE_ERROR_FAILED; error = base::File::Error::FILE_ERROR_FAILED;
bool handled = directory->OpenDirectory( bool handled = directory->OpenDirectory(
"my_dir", MakeRequest(&my_file_directory), "my_dir", my_file_directory.BindNewPipeAndPassReceiver(),
mojom::kFlagRead | mojom::kFlagWrite | mojom::kFlagCreate, &error); mojom::kFlagRead | mojom::kFlagWrite | mojom::kFlagCreate, &error);
ASSERT_TRUE(handled); ASSERT_TRUE(handled);
EXPECT_EQ(base::File::Error::FILE_OK, error); EXPECT_EQ(base::File::Error::FILE_OK, error);
...@@ -250,16 +254,16 @@ TEST_F(DirectoryImplTest, CantReadEntireFileOnADirectory) { ...@@ -250,16 +254,16 @@ TEST_F(DirectoryImplTest, CantReadEntireFileOnADirectory) {
} }
TEST_F(DirectoryImplTest, CantWriteFileOnADirectory) { TEST_F(DirectoryImplTest, CantWriteFileOnADirectory) {
mojom::DirectoryPtr directory; mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory); GetTemporaryRoot(&directory);
base::File::Error error; base::File::Error error;
// Create a directory // Create a directory
{ {
mojom::DirectoryPtr my_file_directory; mojo::Remote<mojom::Directory> my_file_directory;
error = base::File::Error::FILE_ERROR_FAILED; error = base::File::Error::FILE_ERROR_FAILED;
bool handled = directory->OpenDirectory( bool handled = directory->OpenDirectory(
"my_dir", MakeRequest(&my_file_directory), "my_dir", my_file_directory.BindNewPipeAndPassReceiver(),
mojom::kFlagRead | mojom::kFlagWrite | mojom::kFlagCreate, &error); mojom::kFlagRead | mojom::kFlagWrite | mojom::kFlagCreate, &error);
ASSERT_TRUE(handled); ASSERT_TRUE(handled);
EXPECT_EQ(base::File::Error::FILE_OK, error); EXPECT_EQ(base::File::Error::FILE_OK, error);
...@@ -274,7 +278,7 @@ TEST_F(DirectoryImplTest, CantWriteFileOnADirectory) { ...@@ -274,7 +278,7 @@ TEST_F(DirectoryImplTest, CantWriteFileOnADirectory) {
} }
TEST_F(DirectoryImplTest, Flush) { TEST_F(DirectoryImplTest, Flush) {
mojom::DirectoryPtr directory; mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory); GetTemporaryRoot(&directory);
base::File::Error error; base::File::Error error;
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#include "components/services/filesystem/lock_table.h" #include "components/services/filesystem/lock_table.h"
#include "components/services/filesystem/shared_temp_dir.h" #include "components/services/filesystem/shared_temp_dir.h"
#include "components/services/filesystem/util.h" #include "components/services/filesystem/util.h"
#include "mojo/public/cpp/bindings/strong_binding.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h"
static_assert(sizeof(off_t) <= sizeof(int64_t), "off_t too big"); static_assert(sizeof(off_t) <= sizeof(int64_t), "off_t too big");
static_assert(sizeof(size_t) >= sizeof(uint32_t), "size_t too small"); static_assert(sizeof(size_t) >= sizeof(uint32_t), "size_t too small");
...@@ -292,7 +292,8 @@ void FileImpl::Touch(mojom::TimespecOrNowPtr atime, ...@@ -292,7 +292,8 @@ void FileImpl::Touch(mojom::TimespecOrNowPtr atime,
std::move(callback).Run(base::File::Error::FILE_OK); std::move(callback).Run(base::File::Error::FILE_OK);
} }
void FileImpl::Dup(mojom::FileRequest file, DupCallback callback) { void FileImpl::Dup(mojo::PendingReceiver<mojom::File> receiver,
DupCallback callback) {
if (!file_.IsValid()) { if (!file_.IsValid()) {
std::move(callback).Run(GetError(file_)); std::move(callback).Run(GetError(file_));
return; return;
...@@ -304,11 +305,11 @@ void FileImpl::Dup(mojom::FileRequest file, DupCallback callback) { ...@@ -304,11 +305,11 @@ void FileImpl::Dup(mojom::FileRequest file, DupCallback callback) {
return; return;
} }
if (file.is_pending()) { if (receiver) {
mojo::MakeStrongBinding( mojo::MakeSelfOwnedReceiver(
std::make_unique<FileImpl>(path_, std::move(new_file), temp_dir_, std::make_unique<FileImpl>(path_, std::move(new_file), temp_dir_,
lock_table_), lock_table_),
std::move(file)); std::move(receiver));
} }
std::move(callback).Run(base::File::Error::FILE_OK); std::move(callback).Run(base::File::Error::FILE_OK);
} }
......
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#include "base/macros.h" #include "base/macros.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "components/services/filesystem/public/interfaces/directory.mojom.h" #include "components/services/filesystem/public/interfaces/directory.mojom.h"
#include "mojo/public/cpp/bindings/interface_request.h"
namespace base { namespace base {
class FilePath; class FilePath;
...@@ -66,7 +65,8 @@ class FileImpl : public mojom::File { ...@@ -66,7 +65,8 @@ class FileImpl : public mojom::File {
void Touch(mojom::TimespecOrNowPtr atime, void Touch(mojom::TimespecOrNowPtr atime,
mojom::TimespecOrNowPtr mtime, mojom::TimespecOrNowPtr mtime,
TouchCallback callback) override; TouchCallback callback) override;
void Dup(mojom::FileRequest file, DupCallback callback) override; void Dup(mojo::PendingReceiver<mojom::File> receiver,
DupCallback callback) override;
void Flush(FlushCallback callback) override; void Flush(FlushCallback callback) override;
void Lock(LockCallback callback) override; void Lock(LockCallback callback) override;
void Unlock(UnlockCallback callback) override; void Unlock(UnlockCallback callback) override;
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
#include "base/command_line.h" #include "base/command_line.h"
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/files/file_util.h" #include "base/files/file_util.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "services/service_manager/public/cpp/connector.h" #include "services/service_manager/public/cpp/connector.h"
#if defined(OS_WIN) #if defined(OS_WIN)
...@@ -36,28 +35,23 @@ const char kUserDataDir[] = "user-data-dir"; ...@@ -36,28 +35,23 @@ const char kUserDataDir[] = "user-data-dir";
} // namespace } // namespace
FileSystemApp::FileSystemApp(service_manager::mojom::ServiceRequest request) FileSystemApp::FileSystemApp(
: service_binding_(this, std::move(request)), lock_table_(new LockTable) { mojo::PendingReceiver<service_manager::mojom::Service> receiver)
registry_.AddInterface<mojom::FileSystem>( : service_binding_(this, std::move(receiver)),
base::Bind(&FileSystemApp::Create, base::Unretained(this))); lock_table_(base::MakeRefCounted<LockTable>()) {}
}
FileSystemApp::~FileSystemApp() = default; FileSystemApp::~FileSystemApp() = default;
void FileSystemApp::OnBindInterface( void FileSystemApp::OnConnect(
const service_manager::BindSourceInfo& source_info, const service_manager::ConnectSourceInfo& source_info,
const std::string& interface_name, const std::string& interface_name,
mojo::ScopedMessagePipeHandle interface_pipe) { mojo::ScopedMessagePipeHandle receiver_pipe) {
registry_.BindInterface(interface_name, std::move(interface_pipe), if (interface_name == mojom::FileSystem::Name_) {
source_info); file_systems_.Add(
} std::make_unique<FileSystemImpl>(source_info.identity, GetUserDataDir(),
lock_table_),
void FileSystemApp::Create(mojom::FileSystemRequest request, mojo::PendingReceiver<mojom::FileSystem>(std::move(receiver_pipe)));
const service_manager::BindSourceInfo& source_info) { }
mojo::MakeStrongBinding(
std::make_unique<FileSystemImpl>(source_info.identity, GetUserDataDir(),
lock_table_),
std::move(request));
} }
// static // static
......
...@@ -10,7 +10,8 @@ ...@@ -10,7 +10,8 @@
#include "components/services/filesystem/file_system_impl.h" #include "components/services/filesystem/file_system_impl.h"
#include "components/services/filesystem/lock_table.h" #include "components/services/filesystem/lock_table.h"
#include "components/services/filesystem/public/interfaces/file_system.mojom.h" #include "components/services/filesystem/public/interfaces/file_system.mojom.h"
#include "services/service_manager/public/cpp/binder_registry.h" #include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/unique_receiver_set.h"
#include "services/service_manager/public/cpp/service.h" #include "services/service_manager/public/cpp/service.h"
#include "services/service_manager/public/cpp/service_binding.h" #include "services/service_manager/public/cpp/service_binding.h"
...@@ -18,7 +19,8 @@ namespace filesystem { ...@@ -18,7 +19,8 @@ namespace filesystem {
class FileSystemApp : public service_manager::Service { class FileSystemApp : public service_manager::Service {
public: public:
explicit FileSystemApp(service_manager::mojom::ServiceRequest request); explicit FileSystemApp(
mojo::PendingReceiver<service_manager::mojom::Service> receiver);
~FileSystemApp() override; ~FileSystemApp() override;
private: private:
...@@ -26,19 +28,13 @@ class FileSystemApp : public service_manager::Service { ...@@ -26,19 +28,13 @@ class FileSystemApp : public service_manager::Service {
static base::FilePath GetUserDataDir(); static base::FilePath GetUserDataDir();
// |service_manager::Service| override: // |service_manager::Service| override:
void OnBindInterface(const service_manager::BindSourceInfo& source_info, void OnConnect(const service_manager::ConnectSourceInfo& source_info,
const std::string& interface_name, const std::string& interface_name,
mojo::ScopedMessagePipeHandle interface_pipe) override; mojo::ScopedMessagePipeHandle receiver_pipe) override;
void Create(mojom::FileSystemRequest request,
const service_manager::BindSourceInfo& source_info);
service_manager::ServiceBinding service_binding_; service_manager::ServiceBinding service_binding_;
service_manager::BinderRegistryWithArgs<
const service_manager::BindSourceInfo&>
registry_;
scoped_refptr<LockTable> lock_table_; scoped_refptr<LockTable> lock_table_;
mojo::UniqueReceiverSet<mojom::FileSystem> file_systems_;
DISALLOW_COPY_AND_ASSIGN(FileSystemApp); DISALLOW_COPY_AND_ASSIGN(FileSystemApp);
}; };
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include "build/build_config.h" #include "build/build_config.h"
#include "components/services/filesystem/directory_impl.h" #include "components/services/filesystem/directory_impl.h"
#include "components/services/filesystem/lock_table.h" #include "components/services/filesystem/lock_table.h"
#include "mojo/public/cpp/bindings/strong_binding.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "services/service_manager/public/cpp/identity.h" #include "services/service_manager/public/cpp/identity.h"
#include "url/gurl.h" #include "url/gurl.h"
...@@ -30,10 +30,11 @@ FileSystemImpl::FileSystemImpl(const service_manager::Identity& remote_identity, ...@@ -30,10 +30,11 @@ FileSystemImpl::FileSystemImpl(const service_manager::Identity& remote_identity,
lock_table_(std::move(lock_table)), lock_table_(std::move(lock_table)),
persistent_dir_(persistent_dir) {} persistent_dir_(persistent_dir) {}
FileSystemImpl::~FileSystemImpl() {} FileSystemImpl::~FileSystemImpl() = default;
void FileSystemImpl::OpenTempDirectory(mojom::DirectoryRequest directory, void FileSystemImpl::OpenTempDirectory(
OpenTempDirectoryCallback callback) { mojo::PendingReceiver<mojom::Directory> receiver,
OpenTempDirectoryCallback callback) {
// Set only if the |DirectoryImpl| will own a temporary directory. // Set only if the |DirectoryImpl| will own a temporary directory.
std::unique_ptr<base::ScopedTempDir> temp_dir(new base::ScopedTempDir); std::unique_ptr<base::ScopedTempDir> temp_dir(new base::ScopedTempDir);
CHECK(temp_dir->CreateUniqueTempDir()); CHECK(temp_dir->CreateUniqueTempDir());
...@@ -41,14 +42,15 @@ void FileSystemImpl::OpenTempDirectory(mojom::DirectoryRequest directory, ...@@ -41,14 +42,15 @@ void FileSystemImpl::OpenTempDirectory(mojom::DirectoryRequest directory,
base::FilePath path = temp_dir->GetPath(); base::FilePath path = temp_dir->GetPath();
scoped_refptr<SharedTempDir> shared_temp_dir = scoped_refptr<SharedTempDir> shared_temp_dir =
new SharedTempDir(std::move(temp_dir)); new SharedTempDir(std::move(temp_dir));
mojo::MakeStrongBinding(std::make_unique<DirectoryImpl>( mojo::MakeSelfOwnedReceiver(
path, std::move(shared_temp_dir), lock_table_), std::make_unique<DirectoryImpl>(path, std::move(shared_temp_dir),
std::move(directory)); lock_table_),
std::move(receiver));
std::move(callback).Run(base::File::Error::FILE_OK); std::move(callback).Run(base::File::Error::FILE_OK);
} }
void FileSystemImpl::OpenPersistentFileSystem( void FileSystemImpl::OpenPersistentFileSystem(
mojo::InterfaceRequest<mojom::Directory> directory, mojo::PendingReceiver<mojom::Directory> receiver,
OpenPersistentFileSystemCallback callback) { OpenPersistentFileSystemCallback callback) {
std::unique_ptr<base::ScopedTempDir> temp_dir; std::unique_ptr<base::ScopedTempDir> temp_dir;
base::FilePath path = persistent_dir_; base::FilePath path = persistent_dir_;
...@@ -58,9 +60,10 @@ void FileSystemImpl::OpenPersistentFileSystem( ...@@ -58,9 +60,10 @@ void FileSystemImpl::OpenPersistentFileSystem(
scoped_refptr<SharedTempDir> shared_temp_dir = scoped_refptr<SharedTempDir> shared_temp_dir =
new SharedTempDir(std::move(temp_dir)); new SharedTempDir(std::move(temp_dir));
mojo::MakeStrongBinding(std::make_unique<DirectoryImpl>( mojo::MakeSelfOwnedReceiver(
path, std::move(shared_temp_dir), lock_table_), std::make_unique<DirectoryImpl>(path, std::move(shared_temp_dir),
std::move(directory)); lock_table_),
std::move(receiver));
std::move(callback).Run(base::File::Error::FILE_OK); std::move(callback).Run(base::File::Error::FILE_OK);
} }
......
...@@ -27,17 +27,17 @@ class LockTable; ...@@ -27,17 +27,17 @@ class LockTable;
class FileSystemImpl : public mojom::FileSystem { class FileSystemImpl : public mojom::FileSystem {
public: public:
// |persistent_dir| is the directory served to callers of // |persistent_dir| is the directory served to callers of
// |OpenPersistentFileSystem(). // |OpenPersistentFileSystem()|.
FileSystemImpl(const service_manager::Identity& remote_identity, FileSystemImpl(const service_manager::Identity& remote_identity,
base::FilePath persistent_dir, base::FilePath persistent_dir,
scoped_refptr<LockTable> lock_table); scoped_refptr<LockTable> lock_table);
~FileSystemImpl() override; ~FileSystemImpl() override;
// |Files| implementation: // mojom::FileSystem:
void OpenTempDirectory(mojom::DirectoryRequest directory, void OpenTempDirectory(mojo::PendingReceiver<mojom::Directory> receiver,
OpenTempDirectoryCallback callback) override; OpenTempDirectoryCallback callback) override;
void OpenPersistentFileSystem( void OpenPersistentFileSystem(
mojom::DirectoryRequest directory, mojo::PendingReceiver<mojom::Directory> receiver,
OpenPersistentFileSystemCallback callback) override; OpenPersistentFileSystemCallback callback) override;
private: private:
......
...@@ -26,15 +26,17 @@ FilesTestBase::FilesTestBase() ...@@ -26,15 +26,17 @@ FilesTestBase::FilesTestBase()
test_service_( test_service_(
test_service_manager_.RegisterTestInstance(kTestServiceName)) {} test_service_manager_.RegisterTestInstance(kTestServiceName)) {}
FilesTestBase::~FilesTestBase() {} FilesTestBase::~FilesTestBase() = default;
void FilesTestBase::SetUp() { void FilesTestBase::SetUp() {
connector()->BindInterface("filesystem", &files_); connector()->Connect("filesystem", files_.BindNewPipeAndPassReceiver());
} }
void FilesTestBase::GetTemporaryRoot(mojom::DirectoryPtr* directory) { void FilesTestBase::GetTemporaryRoot(
mojo::Remote<mojom::Directory>* directory) {
base::File::Error error = base::File::Error::FILE_ERROR_FAILED; base::File::Error error = base::File::Error::FILE_ERROR_FAILED;
bool handled = files()->OpenTempDirectory(MakeRequest(directory), &error); bool handled = files()->OpenTempDirectory(
directory->BindNewPipeAndPassReceiver(), &error);
ASSERT_TRUE(handled); ASSERT_TRUE(handled);
ASSERT_EQ(base::File::Error::FILE_OK, error); ASSERT_EQ(base::File::Error::FILE_OK, error);
} }
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/test/scoped_task_environment.h" #include "base/test/scoped_task_environment.h"
#include "components/services/filesystem/public/interfaces/file_system.mojom.h" #include "components/services/filesystem/public/interfaces/file_system.mojom.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/remote.h"
#include "services/service_manager/public/cpp/test/test_service.h" #include "services/service_manager/public/cpp/test/test_service.h"
#include "services/service_manager/public/cpp/test/test_service_manager.h" #include "services/service_manager/public/cpp/test/test_service_manager.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -27,18 +27,18 @@ class FilesTestBase : public testing::Test { ...@@ -27,18 +27,18 @@ class FilesTestBase : public testing::Test {
void SetUp() override; void SetUp() override;
protected: protected:
// Note: This has an out parameter rather than returning the |DirectoryPtr|, // Note: This has an out parameter rather than returning the Directory remote,
// since |ASSERT_...()| doesn't work with return values. // since |ASSERT_...()| doesn't work with return values.
void GetTemporaryRoot(mojom::DirectoryPtr* directory); void GetTemporaryRoot(mojo::Remote<mojom::Directory>* directory);
service_manager::Connector* connector() { return test_service_.connector(); } service_manager::Connector* connector() { return test_service_.connector(); }
mojom::FileSystemPtr& files() { return files_; } mojo::Remote<mojom::FileSystem>& files() { return files_; }
private: private:
base::test::ScopedTaskEnvironment task_environment_; base::test::ScopedTaskEnvironment task_environment_;
service_manager::TestServiceManager test_service_manager_; service_manager::TestServiceManager test_service_manager_;
service_manager::TestService test_service_; service_manager::TestService test_service_;
mojom::FileSystemPtr files_; mojo::Remote<mojom::FileSystem> files_;
DISALLOW_COPY_AND_ASSIGN(FilesTestBase); DISALLOW_COPY_AND_ASSIGN(FilesTestBase);
}; };
......
...@@ -42,7 +42,7 @@ interface Directory { ...@@ -42,7 +42,7 @@ interface Directory {
// optional, mainly for consistency with |OpenDirectory()| (but may be useful, // optional, mainly for consistency with |OpenDirectory()| (but may be useful,
// together with |kOpenFlagCreate|, for "touching" a file). // together with |kOpenFlagCreate|, for "touching" a file).
[Sync] [Sync]
OpenFile(string path, File&? file, uint32 open_flags) OpenFile(string path, pending_receiver<File>? file, uint32 open_flags)
=> (mojo_base.mojom.FileError error); => (mojo_base.mojom.FileError error);
// Opens the file specified by |path| with the given |open_flags|. Returns a // Opens the file specified by |path| with the given |open_flags|. Returns a
...@@ -61,7 +61,7 @@ interface Directory { ...@@ -61,7 +61,7 @@ interface Directory {
// this may be used as a simple "mkdir()" with |kOpenFlagCreate|. // this may be used as a simple "mkdir()" with |kOpenFlagCreate|.
[Sync] [Sync]
OpenDirectory(string path, OpenDirectory(string path,
Directory&? directory, pending_receiver<Directory>? directory,
uint32 open_flags) => (mojo_base.mojom.FileError error); uint32 open_flags) => (mojo_base.mojom.FileError error);
// Renames/moves the file/directory given by |path| to |new_path|. // Renames/moves the file/directory given by |path| to |new_path|.
...@@ -102,7 +102,7 @@ interface Directory { ...@@ -102,7 +102,7 @@ interface Directory {
=> (mojo_base.mojom.FileError error, FileInformation? file_information); => (mojo_base.mojom.FileError error, FileInformation? file_information);
// Creates a copy of this directory. // Creates a copy of this directory.
Clone(Directory& directory); Clone(pending_receiver<Directory> directory);
// Reads the contents of an entire file. // Reads the contents of an entire file.
[Sync] [Sync]
......
...@@ -71,7 +71,7 @@ interface File { ...@@ -71,7 +71,7 @@ interface File {
// I.e., the access mode, etc. (as specified to |Directory::OpenFile()| by the // I.e., the access mode, etc. (as specified to |Directory::OpenFile()| by the
// |open_flags| argument) as well as file position. // |open_flags| argument) as well as file position.
[Sync] [Sync]
Dup(File& file) => (mojo_base.mojom.FileError error); Dup(pending_receiver<File> file) => (mojo_base.mojom.FileError error);
// Syncs data to disk. // Syncs data to disk.
[Sync] [Sync]
......
...@@ -11,11 +11,11 @@ interface FileSystem { ...@@ -11,11 +11,11 @@ interface FileSystem {
// Opens a temporary filesystem. Will return a different directory each time // Opens a temporary filesystem. Will return a different directory each time
// it is called. // it is called.
[Sync] [Sync]
OpenTempDirectory(Directory& directory) OpenTempDirectory(pending_receiver<Directory> directory)
=> (mojo_base.mojom.FileError error); => (mojo_base.mojom.FileError error);
// Returns a directory which will persist to disk. // Returns a directory which will persist to disk.
[Sync] [Sync]
OpenPersistentFileSystem(Directory& directory) OpenPersistentFileSystem(pending_receiver<Directory> directory)
=> (mojo_base.mojom.FileError error); => (mojo_base.mojom.FileError error);
}; };
...@@ -258,7 +258,7 @@ void LevelDBMojoProxy::CreateDirImpl(OpaqueDir* dir, ...@@ -258,7 +258,7 @@ void LevelDBMojoProxy::CreateDirImpl(OpaqueDir* dir,
base::File::Error* out_error) { base::File::Error* out_error) {
mojo::SyncCallRestrictions::ScopedAllowSyncCall allow_sync; mojo::SyncCallRestrictions::ScopedAllowSyncCall allow_sync;
bool completed = dir->directory->OpenDirectory( bool completed = dir->directory->OpenDirectory(
name, nullptr, name, mojo::NullReceiver(),
filesystem::mojom::kFlagRead | filesystem::mojom::kFlagWrite | filesystem::mojom::kFlagRead | filesystem::mojom::kFlagWrite |
filesystem::mojom::kFlagCreate, filesystem::mojom::kFlagCreate,
out_error); out_error);
......
...@@ -47,7 +47,7 @@ bool CreateDirectory(filesystem::mojom::DirectoryPtr* output_dir, ...@@ -47,7 +47,7 @@ bool CreateDirectory(filesystem::mojom::DirectoryPtr* output_dir,
const base::FilePath& path) { const base::FilePath& path) {
base::File::Error err = base::File::Error::FILE_OK; base::File::Error err = base::File::Error::FILE_OK;
return (*output_dir) return (*output_dir)
->OpenDirectory(PathToMojoString(path), nullptr, ->OpenDirectory(PathToMojoString(path), mojo::NullReceiver(),
filesystem::mojom::kFlagOpenAlways, &err) && filesystem::mojom::kFlagOpenAlways, &err) &&
err == base::File::Error::FILE_OK; err == base::File::Error::FILE_OK;
} }
......
...@@ -1036,8 +1036,7 @@ TEST_F(LocalStorageContextMojoTestWithService, CorruptionOnDisk) { ...@@ -1036,8 +1036,7 @@ TEST_F(LocalStorageContextMojoTestWithService, CorruptionOnDisk) {
TEST_F(LocalStorageContextMojoTestWithService, RecreateOnCommitFailure) { TEST_F(LocalStorageContextMojoTestWithService, RecreateOnCommitFailure) {
FakeLevelDBService mock_leveldb_service; FakeLevelDBService mock_leveldb_service;
file_service()->GetBinderRegistryForTesting()->AddInterface( file_service()->GetBinderMapForTesting().Add(
leveldb::mojom::LevelDBService::Name_,
base::BindRepeating(&test::FakeLevelDBService::Bind, base::BindRepeating(&test::FakeLevelDBService::Bind,
base::Unretained(&mock_leveldb_service))); base::Unretained(&mock_leveldb_service)));
...@@ -1185,8 +1184,7 @@ TEST_F(LocalStorageContextMojoTestWithService, RecreateOnCommitFailure) { ...@@ -1185,8 +1184,7 @@ TEST_F(LocalStorageContextMojoTestWithService, RecreateOnCommitFailure) {
TEST_F(LocalStorageContextMojoTestWithService, TEST_F(LocalStorageContextMojoTestWithService,
DontRecreateOnRepeatedCommitFailure) { DontRecreateOnRepeatedCommitFailure) {
FakeLevelDBService mock_leveldb_service; FakeLevelDBService mock_leveldb_service;
file_service()->GetBinderRegistryForTesting()->AddInterface( file_service()->GetBinderMapForTesting().Add(
leveldb::mojom::LevelDBService::Name_,
base::BindRepeating(&test::FakeLevelDBService::Bind, base::BindRepeating(&test::FakeLevelDBService::Bind,
base::Unretained(&mock_leveldb_service))); base::Unretained(&mock_leveldb_service)));
......
...@@ -632,8 +632,7 @@ TEST_F(SessionStorageContextMojoTest, RecreateOnCommitFailure) { ...@@ -632,8 +632,7 @@ TEST_F(SessionStorageContextMojoTest, RecreateOnCommitFailure) {
url::Origin origin3 = url::Origin::Create(GURL("http://example.com")); url::Origin origin3 = url::Origin::Create(GURL("http://example.com"));
test::FakeLevelDBService fake_leveldb_service; test::FakeLevelDBService fake_leveldb_service;
file_service()->GetBinderRegistryForTesting()->AddInterface( file_service()->GetBinderMapForTesting().Add(
leveldb::mojom::LevelDBService::Name_,
base::BindRepeating(&test::FakeLevelDBService::Bind, base::BindRepeating(&test::FakeLevelDBService::Bind,
base::Unretained(&fake_leveldb_service))); base::Unretained(&fake_leveldb_service)));
...@@ -768,8 +767,7 @@ TEST_F(SessionStorageContextMojoTest, DontRecreateOnRepeatedCommitFailure) { ...@@ -768,8 +767,7 @@ TEST_F(SessionStorageContextMojoTest, DontRecreateOnRepeatedCommitFailure) {
url::Origin origin1 = url::Origin::Create(GURL("http://foobar.com")); url::Origin origin1 = url::Origin::Create(GURL("http://foobar.com"));
test::FakeLevelDBService fake_leveldb_service; test::FakeLevelDBService fake_leveldb_service;
file_service()->GetBinderRegistryForTesting()->AddInterface( file_service()->GetBinderMapForTesting().Add(
leveldb::mojom::LevelDBService::Name_,
base::BindRepeating(&test::FakeLevelDBService::Bind, base::BindRepeating(&test::FakeLevelDBService::Bind,
base::Unretained(&fake_leveldb_service))); base::Unretained(&fake_leveldb_service)));
......
...@@ -72,11 +72,9 @@ void FakeLevelDBService::Destroy(filesystem::mojom::DirectoryPtr, ...@@ -72,11 +72,9 @@ void FakeLevelDBService::Destroy(filesystem::mojom::DirectoryPtr,
} }
void FakeLevelDBService::Bind( void FakeLevelDBService::Bind(
const std::string& interface_name, const service_manager::Identity& remote_identity,
mojo::ScopedMessagePipeHandle interface_pipe, mojo::PendingReceiver<leveldb::mojom::LevelDBService> receiver) {
const service_manager::BindSourceInfo& source_info) { bindings_.AddBinding(this, std::move(receiver));
bindings_.AddBinding(
this, leveldb::mojom::LevelDBServiceRequest(std::move(interface_pipe)));
} }
void FakeLevelDBService::FlushBindingsForTesting() { void FakeLevelDBService::FlushBindingsForTesting() {
......
...@@ -82,9 +82,8 @@ class FakeLevelDBService : public leveldb::mojom::LevelDBService { ...@@ -82,9 +82,8 @@ class FakeLevelDBService : public leveldb::mojom::LevelDBService {
on_open_callback_ = std::move(on_open_callback); on_open_callback_ = std::move(on_open_callback);
} }
void Bind(const std::string& interface_name, void Bind(const service_manager::Identity& remote_identity,
mojo::ScopedMessagePipeHandle interface_pipe, mojo::PendingReceiver<leveldb::mojom::LevelDBService> receiver);
const service_manager::BindSourceInfo& source_info);
void FlushBindingsForTesting(); void FlushBindingsForTesting();
......
...@@ -176,6 +176,7 @@ component("bindings") { ...@@ -176,6 +176,7 @@ component("bindings") {
"receiver.h", "receiver.h",
"receiver_set.h", "receiver_set.h",
"remote.h", "remote.h",
"self_owned_receiver.h",
"sequence_local_sync_event_watcher.h", "sequence_local_sync_event_watcher.h",
"shared_associated_remote.h", "shared_associated_remote.h",
"shared_remote.h", "shared_remote.h",
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MOJO_PUBLIC_CPP_BINDINGS_SELF_OWNED_RECEIVER_H_
#define MOJO_PUBLIC_CPP_BINDINGS_SELF_OWNED_RECEIVER_H_
#include <memory>
#include <utility>
#include "base/memory/scoped_refptr.h"
#include "base/sequenced_task_runner.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "mojo/public/cpp/system/core.h"
namespace mojo {
template <typename Interface>
using SelfOwnedReceiverRef = StrongBindingPtr<Interface>;
template <typename Interface, typename Impl>
SelfOwnedReceiverRef<Interface> MakeSelfOwnedReceiver(
std::unique_ptr<Impl> impl,
PendingReceiver<Interface> receiver,
scoped_refptr<base::SequencedTaskRunner> task_runner = nullptr) {
return StrongBinding<Interface>::Create(std::move(impl), std::move(receiver),
std::move(task_runner));
}
} // namespace mojo
#endif // MOJO_PUBLIC_CPP_BINDINGS_SELF_OWNED_RECEIVER_H_
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#include "mojo/public/cpp/bindings/filter_chain.h" #include "mojo/public/cpp/bindings/filter_chain.h"
#include "mojo/public/cpp/bindings/interface_ptr.h" #include "mojo/public/cpp/bindings/interface_ptr.h"
#include "mojo/public/cpp/bindings/interface_request.h" #include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/cpp/bindings/message_header_validator.h" #include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/system/core.h" #include "mojo/public/cpp/system/core.h"
namespace mojo { namespace mojo {
......
...@@ -20,7 +20,7 @@ source_set("lib") { ...@@ -20,7 +20,7 @@ source_set("lib") {
"//components/services/filesystem/public/interfaces", "//components/services/filesystem/public/interfaces",
"//components/services/leveldb:lib", "//components/services/leveldb:lib",
"//components/services/leveldb/public/interfaces", "//components/services/leveldb/public/interfaces",
"//mojo/public/cpp/system", "//mojo/public/cpp/bindings",
"//services/file/public/mojom", "//services/file/public/mojom",
"//services/service_manager/public/cpp", "//services/service_manager/public/cpp",
"//services/service_manager/public/mojom", "//services/service_manager/public/mojom",
......
...@@ -4,12 +4,15 @@ ...@@ -4,12 +4,15 @@
#include "services/file/file_service.h" #include "services/file/file_service.h"
#include <utility>
#include "base/bind.h" #include "base/bind.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "components/services/filesystem/lock_table.h" #include "components/services/filesystem/lock_table.h"
#include "components/services/leveldb/leveldb_service_impl.h" #include "components/services/leveldb/leveldb_service_impl.h"
#include "mojo/public/cpp/bindings/strong_binding.h" #include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/unique_receiver_set.h"
#include "services/file/file_system.h" #include "services/file/file_system.h"
#include "services/file/user_id_map.h" #include "services/file/user_id_map.h"
...@@ -22,21 +25,23 @@ class FileService::FileSystemObjects ...@@ -22,21 +25,23 @@ class FileService::FileSystemObjects
FileSystemObjects(base::FilePath user_dir) : user_dir_(user_dir) {} FileSystemObjects(base::FilePath user_dir) : user_dir_(user_dir) {}
// Destroyed on the |file_service_runner_|. // Destroyed on the |file_service_runner_|.
~FileSystemObjects() {} ~FileSystemObjects() = default;
// Called on the |file_service_runner_|. // Called on the |file_service_runner_|.
void OnFileSystemRequest(const service_manager::Identity& remote_identity, void BindFileSystemReceiver(
mojom::FileSystemRequest request) { const service_manager::Identity& remote_identity,
mojo::PendingReceiver<mojom::FileSystem> receiver) {
if (!lock_table_) if (!lock_table_)
lock_table_ = new filesystem::LockTable; lock_table_ = new filesystem::LockTable;
mojo::MakeStrongBinding( file_system_receivers_.Add(
std::make_unique<FileSystem>(user_dir_, lock_table_), std::make_unique<FileSystem>(user_dir_, lock_table_),
std::move(request)); std::move(receiver));
} }
private: private:
scoped_refptr<filesystem::LockTable> lock_table_; scoped_refptr<filesystem::LockTable> lock_table_;
base::FilePath user_dir_; base::FilePath user_dir_;
mojo::UniqueReceiverSet<mojom::FileSystem> file_system_receivers_;
DISALLOW_COPY_AND_ASSIGN(FileSystemObjects); DISALLOW_COPY_AND_ASSIGN(FileSystemObjects);
}; };
...@@ -50,15 +55,17 @@ class FileService::LevelDBServiceObjects ...@@ -50,15 +55,17 @@ class FileService::LevelDBServiceObjects
: file_task_runner_(std::move(file_task_runner)) {} : file_task_runner_(std::move(file_task_runner)) {}
// Destroyed on the |leveldb_service_runner_|. // Destroyed on the |leveldb_service_runner_|.
~LevelDBServiceObjects() {} ~LevelDBServiceObjects() = default;
// Called on the |leveldb_service_runner_|. // Called on the |leveldb_service_runner_|.
void OnLevelDBServiceRequest(const service_manager::Identity& remote_identity, void BindLevelDBServiceReceiver(
leveldb::mojom::LevelDBServiceRequest request) { const service_manager::Identity& remote_identity,
if (!leveldb_service_) mojo::PendingReceiver<leveldb::mojom::LevelDBService> receiver) {
leveldb_service_.reset( if (!leveldb_service_) {
new leveldb::LevelDBServiceImpl(file_task_runner_)); leveldb_service_ =
leveldb_bindings_.AddBinding(leveldb_service_.get(), std::move(request)); std::make_unique<leveldb::LevelDBServiceImpl>(file_task_runner_);
}
leveldb_receivers_.Add(leveldb_service_.get(), std::move(receiver));
} }
private: private:
...@@ -66,21 +73,22 @@ class FileService::LevelDBServiceObjects ...@@ -66,21 +73,22 @@ class FileService::LevelDBServiceObjects
// Variables that are only accessible on the |leveldb_service_runner_| thread. // Variables that are only accessible on the |leveldb_service_runner_| thread.
std::unique_ptr<leveldb::mojom::LevelDBService> leveldb_service_; std::unique_ptr<leveldb::mojom::LevelDBService> leveldb_service_;
mojo::BindingSet<leveldb::mojom::LevelDBService> leveldb_bindings_; mojo::ReceiverSet<leveldb::mojom::LevelDBService> leveldb_receivers_;
DISALLOW_COPY_AND_ASSIGN(LevelDBServiceObjects); DISALLOW_COPY_AND_ASSIGN(LevelDBServiceObjects);
}; };
FileService::FileService(service_manager::mojom::ServiceRequest request) FileService::FileService(
: service_binding_(this, std::move(request)), mojo::PendingReceiver<service_manager::mojom::Service> receiver)
: service_binding_(this, std::move(receiver)),
file_service_runner_(base::CreateSequencedTaskRunnerWithTraits( file_service_runner_(base::CreateSequencedTaskRunnerWithTraits(
{base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN})), {base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN})),
leveldb_service_runner_(base::CreateSequencedTaskRunnerWithTraits( leveldb_service_runner_(base::CreateSequencedTaskRunnerWithTraits(
{base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN})) { {base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN})) {
registry_.AddInterface<leveldb::mojom::LevelDBService>(base::BindRepeating( binders_.Add<leveldb::mojom::LevelDBService>(base::BindRepeating(
&FileService::BindLevelDBServiceRequest, base::Unretained(this))); &FileService::BindLevelDBServiceReceiver, base::Unretained(this)));
registry_.AddInterface<mojom::FileSystem>(base::BindRepeating( binders_.Add<mojom::FileSystem>(base::BindRepeating(
&FileService::BindFileSystemRequest, base::Unretained(this))); &FileService::BindFileSystemReceiver, base::Unretained(this)));
} }
FileService::~FileService() { FileService::~FileService() {
...@@ -89,40 +97,36 @@ FileService::~FileService() { ...@@ -89,40 +97,36 @@ FileService::~FileService() {
} }
void FileService::OnStart() { void FileService::OnStart() {
file_system_objects_.reset( file_system_objects_ = std::make_unique<FileService::FileSystemObjects>(
new FileService::FileSystemObjects(GetUserDirForInstanceGroup( GetUserDirForInstanceGroup(service_binding_.identity().instance_group()));
service_binding_.identity().instance_group()))); leveldb_objects_ = std::make_unique<FileService::LevelDBServiceObjects>(
leveldb_objects_.reset( file_service_runner_);
new FileService::LevelDBServiceObjects(file_service_runner_));
} }
void FileService::OnBindInterface( void FileService::OnConnect(const service_manager::ConnectSourceInfo& source,
const service_manager::BindSourceInfo& source_info, const std::string& interface_name,
const std::string& interface_name, mojo::ScopedMessagePipeHandle receiver_pipe) {
mojo::ScopedMessagePipeHandle interface_pipe) { binders_.TryBind(source.identity, interface_name, &receiver_pipe);
registry_.BindInterface(interface_name, std::move(interface_pipe),
source_info);
} }
void FileService::BindFileSystemRequest( void FileService::BindFileSystemReceiver(
mojom::FileSystemRequest request, const service_manager::Identity& remote_identity,
const service_manager::BindSourceInfo& source_info) { mojo::PendingReceiver<mojom::FileSystem> receiver) {
file_service_runner_->PostTask( file_service_runner_->PostTask(
FROM_HERE, FROM_HERE,
base::BindOnce(&FileService::FileSystemObjects::OnFileSystemRequest, base::BindOnce(&FileService::FileSystemObjects::BindFileSystemReceiver,
file_system_objects_->AsWeakPtr(), source_info.identity, file_system_objects_->AsWeakPtr(), remote_identity,
std::move(request))); std::move(receiver)));
} }
void FileService::BindLevelDBServiceRequest( void FileService::BindLevelDBServiceReceiver(
leveldb::mojom::LevelDBServiceRequest request, const service_manager::Identity& remote_identity,
const service_manager::BindSourceInfo& source_info) { mojo::PendingReceiver<leveldb::mojom::LevelDBService> receiver) {
leveldb_service_runner_->PostTask( leveldb_service_runner_->PostTask(
FROM_HERE, FROM_HERE,
base::BindOnce( base::BindOnce(
&FileService::LevelDBServiceObjects::OnLevelDBServiceRequest, &FileService::LevelDBServiceObjects::BindLevelDBServiceReceiver,
leveldb_objects_->AsWeakPtr(), source_info.identity, leveldb_objects_->AsWeakPtr(), remote_identity, std::move(receiver)));
std::move(request)));
} }
} // namespace user_service } // namespace user_service
...@@ -10,9 +10,10 @@ ...@@ -10,9 +10,10 @@
#include "base/sequenced_task_runner.h" #include "base/sequenced_task_runner.h"
#include "components/services/filesystem/lock_table.h" #include "components/services/filesystem/lock_table.h"
#include "components/services/leveldb/public/interfaces/leveldb.mojom.h" #include "components/services/leveldb/public/interfaces/leveldb.mojom.h"
#include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "services/file/public/mojom/file_system.mojom.h" #include "services/file/public/mojom/file_system.mojom.h"
#include "services/service_manager/public/cpp/binder_registry.h" #include "services/service_manager/public/cpp/binder_map.h"
#include "services/service_manager/public/cpp/service.h" #include "services/service_manager/public/cpp/service.h"
#include "services/service_manager/public/cpp/service_binding.h" #include "services/service_manager/public/cpp/service_binding.h"
#include "services/service_manager/public/mojom/service.mojom.h" #include "services/service_manager/public/mojom/service.mojom.h"
...@@ -21,31 +22,28 @@ namespace file { ...@@ -21,31 +22,28 @@ namespace file {
class FileService : public service_manager::Service { class FileService : public service_manager::Service {
public: public:
explicit FileService(service_manager::mojom::ServiceRequest request); explicit FileService(
mojo::PendingReceiver<service_manager::mojom::Service> receiver);
~FileService() override; ~FileService() override;
service_manager::BinderRegistryWithArgs< service_manager::BinderMapWithContext<const service_manager::Identity&>&
const service_manager::BindSourceInfo&>* GetBinderMapForTesting() {
GetBinderRegistryForTesting() { return binders_;
return &registry_;
} }
private: private:
// service_manager::Service: // service_manager::Service:
void OnStart() override; void OnStart() override;
void OnBindInterface(const service_manager::BindSourceInfo& source_info, void OnConnect(const service_manager::ConnectSourceInfo& source,
const std::string& interface_name, const std::string& interface_name,
mojo::ScopedMessagePipeHandle interface_pipe) override; mojo::ScopedMessagePipeHandle receiver_pipe) override;
void BindFileSystemRequest( void BindFileSystemReceiver(
mojom::FileSystemRequest request, const service_manager::Identity& remote_identity,
const service_manager::BindSourceInfo& source_info); mojo::PendingReceiver<mojom::FileSystem> receiver);
void BindLevelDBServiceReceiver(
void BindLevelDBServiceRequest( const service_manager::Identity& remote_identity,
leveldb::mojom::LevelDBServiceRequest request, mojo::PendingReceiver<leveldb::mojom::LevelDBService> receiver);
const service_manager::BindSourceInfo& source_info);
void OnLevelDBServiceError();
service_manager::ServiceBinding service_binding_; service_manager::ServiceBinding service_binding_;
...@@ -60,9 +58,8 @@ class FileService : public service_manager::Service { ...@@ -60,9 +58,8 @@ class FileService : public service_manager::Service {
class LevelDBServiceObjects; class LevelDBServiceObjects;
std::unique_ptr<LevelDBServiceObjects> leveldb_objects_; std::unique_ptr<LevelDBServiceObjects> leveldb_objects_;
service_manager::BinderRegistryWithArgs< service_manager::BinderMapWithContext<const service_manager::Identity&>
const service_manager::BindSourceInfo&> binders_;
registry_;
DISALLOW_COPY_AND_ASSIGN(FileService); DISALLOW_COPY_AND_ASSIGN(FileService);
}; };
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#include "components/services/filesystem/directory_impl.h" #include "components/services/filesystem/directory_impl.h"
#include "components/services/filesystem/lock_table.h" #include "components/services/filesystem/lock_table.h"
#include "components/services/filesystem/public/interfaces/types.mojom.h" #include "components/services/filesystem/public/interfaces/types.mojom.h"
#include "mojo/public/cpp/bindings/strong_binding.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h"
namespace file { namespace file {
...@@ -26,20 +26,22 @@ FileSystem::FileSystem(const base::FilePath& base_user_dir, ...@@ -26,20 +26,22 @@ FileSystem::FileSystem(const base::FilePath& base_user_dir,
base::CreateDirectory(path_); base::CreateDirectory(path_);
} }
FileSystem::~FileSystem() {} FileSystem::~FileSystem() = default;
void FileSystem::GetDirectory(filesystem::mojom::DirectoryRequest request, void FileSystem::GetDirectory(
GetDirectoryCallback callback) { mojo::PendingReceiver<filesystem::mojom::Directory> receiver,
mojo::MakeStrongBinding( GetDirectoryCallback callback) {
mojo::MakeSelfOwnedReceiver(
std::make_unique<filesystem::DirectoryImpl>( std::make_unique<filesystem::DirectoryImpl>(
path_, scoped_refptr<filesystem::SharedTempDir>(), lock_table_), path_, scoped_refptr<filesystem::SharedTempDir>(), lock_table_),
std::move(request)); std::move(receiver));
std::move(callback).Run(); std::move(callback).Run();
} }
void FileSystem::GetSubDirectory(const std::string& sub_directory_path, void FileSystem::GetSubDirectory(
filesystem::mojom::DirectoryRequest request, const std::string& sub_directory_path,
GetSubDirectoryCallback callback) { mojo::PendingReceiver<filesystem::mojom::Directory> receiver,
GetSubDirectoryCallback callback) {
// Ensure that we've made |subdirectory| recursively under our user dir. // Ensure that we've made |subdirectory| recursively under our user dir.
base::FilePath subdir = path_.Append( base::FilePath subdir = path_.Append(
#if defined(OS_WIN) #if defined(OS_WIN)
...@@ -53,10 +55,10 @@ void FileSystem::GetSubDirectory(const std::string& sub_directory_path, ...@@ -53,10 +55,10 @@ void FileSystem::GetSubDirectory(const std::string& sub_directory_path,
return; return;
} }
mojo::MakeStrongBinding( mojo::MakeSelfOwnedReceiver(
std::make_unique<filesystem::DirectoryImpl>( std::make_unique<filesystem::DirectoryImpl>(
subdir, scoped_refptr<filesystem::SharedTempDir>(), lock_table_), subdir, scoped_refptr<filesystem::SharedTempDir>(), lock_table_),
std::move(request)); std::move(receiver));
std::move(callback).Run(base::File::Error::FILE_OK); std::move(callback).Run(base::File::Error::FILE_OK);
} }
......
...@@ -23,11 +23,13 @@ class FileSystem : public mojom::FileSystem { ...@@ -23,11 +23,13 @@ class FileSystem : public mojom::FileSystem {
~FileSystem() override; ~FileSystem() override;
// Overridden from mojom::FileSystem: // Overridden from mojom::FileSystem:
void GetDirectory(filesystem::mojom::DirectoryRequest request, void GetDirectory(
GetDirectoryCallback callback) override; mojo::PendingReceiver<filesystem::mojom::Directory> receiver,
void GetSubDirectory(const std::string& sub_directory_path, GetDirectoryCallback callback) override;
filesystem::mojom::DirectoryRequest request, void GetSubDirectory(
GetSubDirectoryCallback callback) override; const std::string& sub_directory_path,
mojo::PendingReceiver<filesystem::mojom::Directory> receiver,
GetSubDirectoryCallback callback) override;
private: private:
scoped_refptr<filesystem::LockTable> lock_table_; scoped_refptr<filesystem::LockTable> lock_table_;
......
...@@ -10,10 +10,11 @@ import "mojo/public/mojom/base/file_error.mojom"; ...@@ -10,10 +10,11 @@ import "mojo/public/mojom/base/file_error.mojom";
// Provide access to various directories within the requesting user's directory. // Provide access to various directories within the requesting user's directory.
interface FileSystem { interface FileSystem {
// Returns the user's directory. // Returns the user's directory.
GetDirectory(filesystem.mojom.Directory& dir) => (); GetDirectory(pending_receiver<filesystem.mojom.Directory> dir) => ();
// Returns a subdirectory under the user's dir. Returns a filesystem error // Returns a subdirectory under the user's dir. Returns a filesystem error
// when we fail to create the subdirectory. // when we fail to create the subdirectory.
GetSubDirectory(string dir_path, filesystem.mojom.Directory& dir) GetSubDirectory(string dir_path,
pending_receiver<filesystem.mojom.Directory> dir)
=> (mojo_base.mojom.FileError err); => (mojo_base.mojom.FileError err);
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment