OLD | NEW |
---|---|
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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/preferences/public/cpp/pref_store_manager_impl.h" | 5 #include "services/preferences/public/cpp/pref_store_manager_impl.h" |
6 | 6 |
7 #include <utility> | |
8 | |
7 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
10 #include "base/threading/sequenced_worker_pool.h" | |
8 #include "components/prefs/pref_value_store.h" | 11 #include "components/prefs/pref_value_store.h" |
9 #include "mojo/public/cpp/bindings/interface_request.h" | 12 #include "mojo/public/cpp/bindings/interface_request.h" |
13 #include "services/preferences/persistent_pref_store_factory.h" | |
14 #include "services/preferences/persistent_pref_store_impl.h" | |
10 #include "services/service_manager/public/cpp/interface_registry.h" | 15 #include "services/service_manager/public/cpp/interface_registry.h" |
11 | 16 |
12 namespace prefs { | 17 namespace prefs { |
18 namespace { | |
13 | 19 |
14 using ConnectCallback = mojom::PrefStoreConnector::ConnectCallback; | 20 using ConnectCallback = mojom::PrefStoreConnector::ConnectCallback; |
15 using PrefStorePtrs = | 21 using PrefStorePtrs = |
16 std::unordered_map<PrefValueStore::PrefStoreType, mojom::PrefStorePtr>; | 22 std::unordered_map<PrefValueStore::PrefStoreType, mojom::PrefStorePtr>; |
17 | 23 |
18 // Used to make sure all pref stores have been registered before replying to any | 24 // Used to make sure all pref stores have been registered before replying to any |
19 // Connect calls. | 25 // Connect calls. |
20 class ConnectionBarrier : public base::RefCounted<ConnectionBarrier> { | 26 class ConnectionBarrier : public base::RefCounted<ConnectionBarrier> { |
21 public: | 27 public: |
22 static void Create(const PrefStorePtrs& pref_store_ptrs, | 28 static void Create(const PrefStorePtrs& pref_store_ptrs, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
66 PrefValueStore::PrefStoreType type, | 72 PrefValueStore::PrefStoreType type, |
67 mojom::PrefStoreConnectionPtr connection_ptr) { | 73 mojom::PrefStoreConnectionPtr connection_ptr) { |
68 connections_.insert(std::make_pair(type, std::move(connection_ptr))); | 74 connections_.insert(std::make_pair(type, std::move(connection_ptr))); |
69 if (connections_.size() == expected_connections_) { | 75 if (connections_.size() == expected_connections_) { |
70 // After this method exits |this| will get destroyed so it's safe to move | 76 // After this method exits |this| will get destroyed so it's safe to move |
71 // out the map. | 77 // out the map. |
72 callback_.Run(std::move(connections_)); | 78 callback_.Run(std::move(connections_)); |
73 } | 79 } |
74 } | 80 } |
75 | 81 |
76 PrefStoreManagerImpl::PrefStoreManagerImpl(PrefStoreTypes expected_pref_stores) | 82 } // namespace |
77 : expected_pref_stores_(std::move(expected_pref_stores)) {} | 83 |
84 PrefStoreManagerImpl::PrefStoreManagerImpl( | |
85 PrefStoreTypes expected_pref_stores, | |
86 scoped_refptr<base::SequencedWorkerPool> worker_pool) | |
87 : expected_pref_stores_(std::move(expected_pref_stores)), | |
88 init_binding_(this), | |
89 worker_pool_(std::move(worker_pool)) {} | |
78 | 90 |
79 PrefStoreManagerImpl::~PrefStoreManagerImpl() = default; | 91 PrefStoreManagerImpl::~PrefStoreManagerImpl() = default; |
80 | 92 |
81 void PrefStoreManagerImpl::Register(PrefValueStore::PrefStoreType type, | 93 void PrefStoreManagerImpl::Register(PrefValueStore::PrefStoreType type, |
82 mojom::PrefStorePtr pref_store_ptr) { | 94 mojom::PrefStorePtr pref_store_ptr) { |
83 if (expected_pref_stores_.count(type) == 0) { | 95 if (expected_pref_stores_.count(type) == 0) { |
84 LOG(WARNING) << "Not registering unexpected pref store: " << type; | 96 LOG(WARNING) << "Not registering unexpected pref store: " << type; |
85 return; | 97 return; |
86 } | 98 } |
87 DVLOG(1) << "Registering pref store: " << type; | 99 DVLOG(1) << "Registering pref store: " << type; |
(...skipping 24 matching lines...) Expand all Loading... | |
112 prefs::mojom::PrefStoreConnectorRequest request) { | 124 prefs::mojom::PrefStoreConnectorRequest request) { |
113 connector_bindings_.AddBinding(this, std::move(request)); | 125 connector_bindings_.AddBinding(this, std::move(request)); |
114 } | 126 } |
115 | 127 |
116 void PrefStoreManagerImpl::Create( | 128 void PrefStoreManagerImpl::Create( |
117 const service_manager::Identity& remote_identity, | 129 const service_manager::Identity& remote_identity, |
118 prefs::mojom::PrefStoreRegistryRequest request) { | 130 prefs::mojom::PrefStoreRegistryRequest request) { |
119 registry_bindings_.AddBinding(this, std::move(request)); | 131 registry_bindings_.AddBinding(this, std::move(request)); |
120 } | 132 } |
121 | 133 |
134 void PrefStoreManagerImpl::Create( | |
135 const service_manager::Identity& remote_identity, | |
136 prefs::mojom::PersistentPrefStoreConnectorRequest request) { | |
137 if (!persistent_pref_store_) { | |
138 pending_persistent_pref_store_requests_.push_back(std::move(request)); | |
139 return; | |
140 } | |
141 persistent_pref_store_bindings_.AddBinding(persistent_pref_store_.get(), | |
142 std::move(request)); | |
143 } | |
144 | |
145 void PrefStoreManagerImpl::Create( | |
146 const service_manager::Identity& remote_identity, | |
147 prefs::mojom::PrefServiceControlRequest request) { | |
148 if (init_binding_.is_bound()) | |
149 return; | |
tibell
2017/03/10 04:20:24
Is this an error condition we want to warn about?
Sam McNally
2017/03/10 05:06:56
Done.
| |
150 | |
151 init_binding_.Bind(std::move(request)); | |
152 } | |
153 | |
154 void PrefStoreManagerImpl::Init( | |
155 mojom::PersistentPrefStoreConfigurationPtr configuration) { | |
156 DCHECK(!persistent_pref_store_); | |
157 | |
158 persistent_pref_store_ = | |
159 CreatePersistentPrefStore(std::move(configuration), worker_pool_.get()); | |
160 DCHECK(persistent_pref_store_); | |
161 for (auto& request : pending_persistent_pref_store_requests_) { | |
162 persistent_pref_store_bindings_.AddBinding(persistent_pref_store_.get(), | |
163 std::move(request)); | |
164 } | |
165 pending_persistent_pref_store_requests_.clear(); | |
166 } | |
167 | |
122 void PrefStoreManagerImpl::OnStart() {} | 168 void PrefStoreManagerImpl::OnStart() {} |
123 | 169 |
124 bool PrefStoreManagerImpl::OnConnect( | 170 bool PrefStoreManagerImpl::OnConnect( |
125 const service_manager::ServiceInfo& remote_info, | 171 const service_manager::ServiceInfo& remote_info, |
126 service_manager::InterfaceRegistry* registry) { | 172 service_manager::InterfaceRegistry* registry) { |
127 registry->AddInterface<prefs::mojom::PrefStoreConnector>(this); | 173 registry->AddInterface<prefs::mojom::PrefStoreConnector>(this); |
128 registry->AddInterface<prefs::mojom::PrefStoreRegistry>(this); | 174 registry->AddInterface<prefs::mojom::PrefStoreRegistry>(this); |
175 registry->AddInterface<prefs::mojom::PersistentPrefStoreConnector>(this); | |
176 registry->AddInterface<prefs::mojom::PrefServiceControl>(this); | |
129 return true; | 177 return true; |
130 } | 178 } |
131 | 179 |
132 void PrefStoreManagerImpl::OnPrefStoreDisconnect( | 180 void PrefStoreManagerImpl::OnPrefStoreDisconnect( |
133 PrefValueStore::PrefStoreType type) { | 181 PrefValueStore::PrefStoreType type) { |
134 DVLOG(1) << "Deregistering pref store: " << type; | 182 DVLOG(1) << "Deregistering pref store: " << type; |
135 pref_store_ptrs_.erase(type); | 183 pref_store_ptrs_.erase(type); |
136 } | 184 } |
137 | 185 |
138 bool PrefStoreManagerImpl::AllConnected() const { | 186 bool PrefStoreManagerImpl::AllConnected() const { |
139 return pref_store_ptrs_.size() == expected_pref_stores_.size(); | 187 return pref_store_ptrs_.size() == expected_pref_stores_.size(); |
140 } | 188 } |
141 | 189 |
142 } // namespace prefs | 190 } // namespace prefs |
OLD | NEW |