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/user/user_shell_client.h" | 5 #include "services/user/user_shell_client.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/memory/weak_ptr.h" | 8 #include "base/memory/weak_ptr.h" |
9 #include "components/filesystem/lock_table.h" | 9 #include "components/filesystem/lock_table.h" |
10 #include "components/leveldb/leveldb_service_impl.h" | 10 #include "components/leveldb/leveldb_service_impl.h" |
11 #include "mojo/public/cpp/bindings/callback.h" | 11 #include "mojo/public/cpp/bindings/callback.h" |
12 #include "services/shell/public/cpp/connection.h" | 12 #include "services/shell/public/cpp/connection.h" |
13 #include "services/user/user_id_map.h" | 13 #include "services/user/user_id_map.h" |
14 #include "services/user/user_service.h" | 14 #include "services/user/user_service.h" |
15 | 15 |
16 namespace user_service { | 16 namespace user_service { |
17 | 17 |
18 class UserShellClient::UserServiceObjects | 18 class UserShellClient::UserServiceObjects |
19 : public base::SupportsWeakPtr<UserServiceObjects> { | 19 : public base::SupportsWeakPtr<UserServiceObjects> { |
20 public: | 20 public: |
21 // Created on the main thread. | 21 // Created on the main thread. |
22 UserServiceObjects(base::FilePath user_dir) : user_dir_(user_dir) {} | 22 UserServiceObjects(base::FilePath user_dir) : user_dir_(user_dir) {} |
23 | 23 |
24 // Destroyed on the |user_service_runner_|. | 24 // Destroyed on the |user_service_runner_|. |
25 ~UserServiceObjects() {} | 25 ~UserServiceObjects() {} |
26 | 26 |
27 // Called on the |user_service_runner_|. | 27 // Called on the |user_service_runner_|. |
28 void OnUserServiceRequest(mojo::Connection* connection, | 28 void OnUserServiceRequest(shell::Connection* connection, |
29 mojom::UserServiceRequest request) { | 29 mojom::UserServiceRequest request) { |
30 if (!lock_table_) | 30 if (!lock_table_) |
31 lock_table_ = new filesystem::LockTable; | 31 lock_table_ = new filesystem::LockTable; |
32 user_service_bindings_.AddBinding(new UserService(user_dir_, lock_table_), | 32 user_service_bindings_.AddBinding(new UserService(user_dir_, lock_table_), |
33 std::move(request)); | 33 std::move(request)); |
34 } | 34 } |
35 | 35 |
36 private: | 36 private: |
37 mojo::BindingSet<mojom::UserService> user_service_bindings_; | 37 mojo::BindingSet<mojom::UserService> user_service_bindings_; |
38 scoped_refptr<filesystem::LockTable> lock_table_; | 38 scoped_refptr<filesystem::LockTable> lock_table_; |
39 base::FilePath user_dir_; | 39 base::FilePath user_dir_; |
40 | 40 |
41 DISALLOW_COPY_AND_ASSIGN(UserServiceObjects); | 41 DISALLOW_COPY_AND_ASSIGN(UserServiceObjects); |
42 }; | 42 }; |
43 | 43 |
44 class UserShellClient::LevelDBServiceObjects | 44 class UserShellClient::LevelDBServiceObjects |
45 : public base::SupportsWeakPtr<LevelDBServiceObjects> { | 45 : public base::SupportsWeakPtr<LevelDBServiceObjects> { |
46 public: | 46 public: |
47 // Created on the main thread. | 47 // Created on the main thread. |
48 LevelDBServiceObjects(scoped_refptr<base::SingleThreadTaskRunner> task_runner) | 48 LevelDBServiceObjects(scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
49 : task_runner_(std::move(task_runner)) {} | 49 : task_runner_(std::move(task_runner)) {} |
50 | 50 |
51 // Destroyed on the |leveldb_service_runner_|. | 51 // Destroyed on the |leveldb_service_runner_|. |
52 ~LevelDBServiceObjects() {} | 52 ~LevelDBServiceObjects() {} |
53 | 53 |
54 // Called on the |leveldb_service_runner_|. | 54 // Called on the |leveldb_service_runner_|. |
55 void OnLevelDBServiceRequest(mojo::Connection* connection, | 55 void OnLevelDBServiceRequest(shell::Connection* connection, |
56 leveldb::LevelDBServiceRequest request) { | 56 leveldb::LevelDBServiceRequest request) { |
57 if (!leveldb_service_) | 57 if (!leveldb_service_) |
58 leveldb_service_.reset(new leveldb::LevelDBServiceImpl(task_runner_)); | 58 leveldb_service_.reset(new leveldb::LevelDBServiceImpl(task_runner_)); |
59 leveldb_bindings_.AddBinding(leveldb_service_.get(), std::move(request)); | 59 leveldb_bindings_.AddBinding(leveldb_service_.get(), std::move(request)); |
60 } | 60 } |
61 | 61 |
62 private: | 62 private: |
63 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 63 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
64 | 64 |
65 // Variables that are only accessible on the |leveldb_service_runner_| thread. | 65 // Variables that are only accessible on the |leveldb_service_runner_| thread. |
66 scoped_ptr<leveldb::LevelDBService> leveldb_service_; | 66 scoped_ptr<leveldb::LevelDBService> leveldb_service_; |
67 mojo::BindingSet<leveldb::LevelDBService> leveldb_bindings_; | 67 mojo::BindingSet<leveldb::LevelDBService> leveldb_bindings_; |
68 | 68 |
69 DISALLOW_COPY_AND_ASSIGN(LevelDBServiceObjects); | 69 DISALLOW_COPY_AND_ASSIGN(LevelDBServiceObjects); |
70 }; | 70 }; |
71 | 71 |
72 scoped_ptr<mojo::ShellClient> CreateUserShellClient( | 72 scoped_ptr<shell::ShellClient> CreateUserShellClient( |
73 scoped_refptr<base::SingleThreadTaskRunner> user_service_runner, | 73 scoped_refptr<base::SingleThreadTaskRunner> user_service_runner, |
74 scoped_refptr<base::SingleThreadTaskRunner> leveldb_service_runner) { | 74 scoped_refptr<base::SingleThreadTaskRunner> leveldb_service_runner) { |
75 return make_scoped_ptr(new UserShellClient(std::move(user_service_runner), | 75 return make_scoped_ptr(new UserShellClient(std::move(user_service_runner), |
76 std::move(leveldb_service_runner))); | 76 std::move(leveldb_service_runner))); |
77 } | 77 } |
78 | 78 |
79 UserShellClient::UserShellClient( | 79 UserShellClient::UserShellClient( |
80 scoped_refptr<base::SingleThreadTaskRunner> user_service_runner, | 80 scoped_refptr<base::SingleThreadTaskRunner> user_service_runner, |
81 scoped_refptr<base::SingleThreadTaskRunner> leveldb_service_runner) | 81 scoped_refptr<base::SingleThreadTaskRunner> leveldb_service_runner) |
82 : user_service_runner_(std::move(user_service_runner)), | 82 : user_service_runner_(std::move(user_service_runner)), |
83 leveldb_service_runner_(std::move(leveldb_service_runner)) {} | 83 leveldb_service_runner_(std::move(leveldb_service_runner)) {} |
84 | 84 |
85 UserShellClient::~UserShellClient() { | 85 UserShellClient::~UserShellClient() { |
86 user_service_runner_->DeleteSoon(FROM_HERE, user_objects_.release()); | 86 user_service_runner_->DeleteSoon(FROM_HERE, user_objects_.release()); |
87 leveldb_service_runner_->DeleteSoon(FROM_HERE, leveldb_objects_.release()); | 87 leveldb_service_runner_->DeleteSoon(FROM_HERE, leveldb_objects_.release()); |
88 } | 88 } |
89 | 89 |
90 void UserShellClient::Initialize(mojo::Connector* connector, | 90 void UserShellClient::Initialize(shell::Connector* connector, |
91 const mojo::Identity& identity, | 91 const shell::Identity& identity, |
92 uint32_t id) { | 92 uint32_t id) { |
93 tracing_.Initialize(connector, identity.name()); | 93 tracing_.Initialize(connector, identity.name()); |
94 user_objects_.reset(new UserShellClient::UserServiceObjects( | 94 user_objects_.reset(new UserShellClient::UserServiceObjects( |
95 GetUserDirForUserID(identity.user_id()))); | 95 GetUserDirForUserID(identity.user_id()))); |
96 leveldb_objects_.reset( | 96 leveldb_objects_.reset( |
97 new UserShellClient::LevelDBServiceObjects(leveldb_service_runner_)); | 97 new UserShellClient::LevelDBServiceObjects(leveldb_service_runner_)); |
98 } | 98 } |
99 | 99 |
100 bool UserShellClient::AcceptConnection(mojo::Connection* connection) { | 100 bool UserShellClient::AcceptConnection(shell::Connection* connection) { |
101 connection->AddInterface<leveldb::LevelDBService>(this); | 101 connection->AddInterface<leveldb::LevelDBService>(this); |
102 connection->AddInterface<mojom::UserService>(this); | 102 connection->AddInterface<mojom::UserService>(this); |
103 return true; | 103 return true; |
104 } | 104 } |
105 | 105 |
106 void UserShellClient::Create(mojo::Connection* connection, | 106 void UserShellClient::Create(shell::Connection* connection, |
107 mojom::UserServiceRequest request) { | 107 mojom::UserServiceRequest request) { |
108 user_service_runner_->PostTask( | 108 user_service_runner_->PostTask( |
109 FROM_HERE, | 109 FROM_HERE, |
110 base::Bind(&UserShellClient::UserServiceObjects::OnUserServiceRequest, | 110 base::Bind(&UserShellClient::UserServiceObjects::OnUserServiceRequest, |
111 user_objects_->AsWeakPtr(), connection, | 111 user_objects_->AsWeakPtr(), connection, |
112 base::Passed(&request))); | 112 base::Passed(&request))); |
113 } | 113 } |
114 | 114 |
115 void UserShellClient::Create(mojo::Connection* connection, | 115 void UserShellClient::Create(shell::Connection* connection, |
116 leveldb::LevelDBServiceRequest request) { | 116 leveldb::LevelDBServiceRequest request) { |
117 leveldb_service_runner_->PostTask( | 117 leveldb_service_runner_->PostTask( |
118 FROM_HERE, | 118 FROM_HERE, |
119 base::Bind( | 119 base::Bind( |
120 &UserShellClient::LevelDBServiceObjects::OnLevelDBServiceRequest, | 120 &UserShellClient::LevelDBServiceObjects::OnLevelDBServiceRequest, |
121 leveldb_objects_->AsWeakPtr(), connection, | 121 leveldb_objects_->AsWeakPtr(), connection, |
122 base::Passed(&request))); | 122 base::Passed(&request))); |
123 } | 123 } |
124 | 124 |
125 } // namespace user_service | 125 } // namespace user_service |
OLD | NEW |