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 |