| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "services/file/file_service.h" | 5 #include "services/file/file_service.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
| 9 #include "base/memory/weak_ptr.h" | 9 #include "base/memory/weak_ptr.h" |
| 10 #include "components/filesystem/lock_table.h" | 10 #include "components/filesystem/lock_table.h" |
| 11 #include "components/leveldb/env_mojo.h" |
| 11 #include "components/leveldb/leveldb_service_impl.h" | 12 #include "components/leveldb/leveldb_service_impl.h" |
| 12 #include "mojo/public/cpp/bindings/strong_binding.h" | 13 #include "mojo/public/cpp/bindings/strong_binding.h" |
| 13 #include "services/file/file_system.h" | 14 #include "services/file/file_system.h" |
| 14 #include "services/file/user_id_map.h" | 15 #include "services/file/user_id_map.h" |
| 15 #include "services/service_manager/public/cpp/connection.h" | 16 #include "services/service_manager/public/cpp/connection.h" |
| 16 #include "services/service_manager/public/cpp/service_context.h" | 17 #include "services/service_manager/public/cpp/service_context.h" |
| 17 | 18 |
| 18 namespace file { | 19 namespace file { |
| 19 | 20 |
| 20 class FileService::FileSystemObjects | 21 class FileService::FileSystemObjects |
| (...skipping 19 matching lines...) Expand all Loading... |
| 40 scoped_refptr<filesystem::LockTable> lock_table_; | 41 scoped_refptr<filesystem::LockTable> lock_table_; |
| 41 base::FilePath user_dir_; | 42 base::FilePath user_dir_; |
| 42 | 43 |
| 43 DISALLOW_COPY_AND_ASSIGN(FileSystemObjects); | 44 DISALLOW_COPY_AND_ASSIGN(FileSystemObjects); |
| 44 }; | 45 }; |
| 45 | 46 |
| 46 class FileService::LevelDBServiceObjects | 47 class FileService::LevelDBServiceObjects |
| 47 : public base::SupportsWeakPtr<LevelDBServiceObjects> { | 48 : public base::SupportsWeakPtr<LevelDBServiceObjects> { |
| 48 public: | 49 public: |
| 49 // Created on the main thread. | 50 // Created on the main thread. |
| 50 LevelDBServiceObjects( | 51 LevelDBServiceObjects(leveldb::MojoEnv* env) : env_(env) {} |
| 51 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) | |
| 52 : file_task_runner_(std::move(file_task_runner)) {} | |
| 53 | 52 |
| 54 // Destroyed on the |leveldb_service_runner_|. | 53 // Destroyed on the |leveldb_service_runner_|. |
| 55 ~LevelDBServiceObjects() {} | 54 ~LevelDBServiceObjects() {} |
| 56 | 55 |
| 57 // Called on the |leveldb_service_runner_|. | 56 // Called on the |leveldb_service_runner_|. |
| 58 void OnLevelDBServiceRequest(const service_manager::Identity& remote_identity, | 57 void OnLevelDBServiceRequest(const service_manager::Identity& remote_identity, |
| 59 leveldb::mojom::LevelDBServiceRequest request) { | 58 leveldb::mojom::LevelDBServiceRequest request) { |
| 60 if (!leveldb_service_) | 59 if (!leveldb_service_) |
| 61 leveldb_service_.reset( | 60 leveldb_service_.reset(new leveldb::LevelDBServiceImpl(env_)); |
| 62 new leveldb::LevelDBServiceImpl(file_task_runner_)); | |
| 63 leveldb_bindings_.AddBinding(leveldb_service_.get(), std::move(request)); | 61 leveldb_bindings_.AddBinding(leveldb_service_.get(), std::move(request)); |
| 64 } | 62 } |
| 65 | 63 |
| 66 private: | 64 private: |
| 67 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; | |
| 68 | |
| 69 // Variables that are only accessible on the |leveldb_service_runner_| thread. | 65 // Variables that are only accessible on the |leveldb_service_runner_| thread. |
| 70 std::unique_ptr<leveldb::mojom::LevelDBService> leveldb_service_; | 66 std::unique_ptr<leveldb::mojom::LevelDBService> leveldb_service_; |
| 71 mojo::BindingSet<leveldb::mojom::LevelDBService> leveldb_bindings_; | 67 mojo::BindingSet<leveldb::mojom::LevelDBService> leveldb_bindings_; |
| 72 | 68 |
| 69 leveldb::MojoEnv* env_; |
| 70 |
| 73 DISALLOW_COPY_AND_ASSIGN(LevelDBServiceObjects); | 71 DISALLOW_COPY_AND_ASSIGN(LevelDBServiceObjects); |
| 74 }; | 72 }; |
| 75 | 73 |
| 76 std::unique_ptr<service_manager::Service> CreateFileService( | 74 std::unique_ptr<service_manager::Service> CreateFileService( |
| 77 scoped_refptr<base::SingleThreadTaskRunner> file_service_runner, | 75 leveldb::MojoEnv* leveldb_env, |
| 78 scoped_refptr<base::SingleThreadTaskRunner> leveldb_service_runner) { | 76 scoped_refptr<base::SingleThreadTaskRunner> leveldb_service_runner) { |
| 79 return base::MakeUnique<FileService>(std::move(file_service_runner), | 77 return base::MakeUnique<FileService>(leveldb_env, |
| 80 std::move(leveldb_service_runner)); | 78 std::move(leveldb_service_runner)); |
| 81 } | 79 } |
| 82 | 80 |
| 83 FileService::FileService( | 81 FileService::FileService( |
| 84 scoped_refptr<base::SingleThreadTaskRunner> file_service_runner, | 82 leveldb::MojoEnv* leveldb_env, |
| 85 scoped_refptr<base::SingleThreadTaskRunner> leveldb_service_runner) | 83 scoped_refptr<base::SingleThreadTaskRunner> leveldb_service_runner) |
| 86 : file_service_runner_(std::move(file_service_runner)), | 84 : leveldb_env_(leveldb_env), |
| 87 leveldb_service_runner_(std::move(leveldb_service_runner)) { | 85 leveldb_service_runner_(std::move(leveldb_service_runner)) { |
| 88 registry_.AddInterface<leveldb::mojom::LevelDBService>(this); | 86 registry_.AddInterface<leveldb::mojom::LevelDBService>(this); |
| 89 registry_.AddInterface<mojom::FileSystem>(this); | 87 registry_.AddInterface<mojom::FileSystem>(this); |
| 90 } | 88 } |
| 91 | 89 |
| 92 FileService::~FileService() { | 90 FileService::~FileService() { |
| 93 file_service_runner_->DeleteSoon(FROM_HERE, file_system_objects_.release()); | 91 leveldb_env_->file_task_runner()->DeleteSoon(FROM_HERE, |
| 92 file_system_objects_.release()); |
| 94 leveldb_service_runner_->DeleteSoon(FROM_HERE, leveldb_objects_.release()); | 93 leveldb_service_runner_->DeleteSoon(FROM_HERE, leveldb_objects_.release()); |
| 95 } | 94 } |
| 96 | 95 |
| 97 void FileService::OnStart() { | 96 void FileService::OnStart() { |
| 98 file_system_objects_.reset(new FileService::FileSystemObjects( | 97 file_system_objects_.reset(new FileService::FileSystemObjects( |
| 99 GetUserDirForUserId(context()->identity().user_id()))); | 98 GetUserDirForUserId(context()->identity().user_id()))); |
| 100 leveldb_objects_.reset( | 99 leveldb_objects_.reset(new FileService::LevelDBServiceObjects(leveldb_env_)); |
| 101 new FileService::LevelDBServiceObjects(file_service_runner_)); | |
| 102 } | 100 } |
| 103 | 101 |
| 104 void FileService::OnBindInterface( | 102 void FileService::OnBindInterface( |
| 105 const service_manager::ServiceInfo& source_info, | 103 const service_manager::ServiceInfo& source_info, |
| 106 const std::string& interface_name, | 104 const std::string& interface_name, |
| 107 mojo::ScopedMessagePipeHandle interface_pipe) { | 105 mojo::ScopedMessagePipeHandle interface_pipe) { |
| 108 registry_.BindInterface(source_info.identity, interface_name, | 106 registry_.BindInterface(source_info.identity, interface_name, |
| 109 std::move(interface_pipe)); | 107 std::move(interface_pipe)); |
| 110 } | 108 } |
| 111 | 109 |
| 112 void FileService::Create(const service_manager::Identity& remote_identity, | 110 void FileService::Create(const service_manager::Identity& remote_identity, |
| 113 mojom::FileSystemRequest request) { | 111 mojom::FileSystemRequest request) { |
| 114 file_service_runner_->PostTask( | 112 leveldb_env_->file_task_runner()->PostTask( |
| 115 FROM_HERE, | 113 FROM_HERE, |
| 116 base::Bind(&FileService::FileSystemObjects::OnFileSystemRequest, | 114 base::Bind(&FileService::FileSystemObjects::OnFileSystemRequest, |
| 117 file_system_objects_->AsWeakPtr(), remote_identity, | 115 file_system_objects_->AsWeakPtr(), remote_identity, |
| 118 base::Passed(&request))); | 116 base::Passed(&request))); |
| 119 } | 117 } |
| 120 | 118 |
| 121 void FileService::Create(const service_manager::Identity& remote_identity, | 119 void FileService::Create(const service_manager::Identity& remote_identity, |
| 122 leveldb::mojom::LevelDBServiceRequest request) { | 120 leveldb::mojom::LevelDBServiceRequest request) { |
| 123 leveldb_service_runner_->PostTask( | 121 leveldb_service_runner_->PostTask( |
| 124 FROM_HERE, | 122 FROM_HERE, |
| 125 base::Bind( | 123 base::Bind( |
| 126 &FileService::LevelDBServiceObjects::OnLevelDBServiceRequest, | 124 &FileService::LevelDBServiceObjects::OnLevelDBServiceRequest, |
| 127 leveldb_objects_->AsWeakPtr(), remote_identity, | 125 leveldb_objects_->AsWeakPtr(), remote_identity, |
| 128 base::Passed(&request))); | 126 base::Passed(&request))); |
| 129 } | 127 } |
| 130 | 128 |
| 131 } // namespace user_service | 129 } // namespace user_service |
| OLD | NEW |