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 LOG(ERROR) |
| 150 << "Pref service received unexpected control interface connection from " |
| 151 << remote_identity.name(); |
| 152 return; |
| 153 } |
| 154 |
| 155 init_binding_.Bind(std::move(request)); |
| 156 } |
| 157 |
| 158 void PrefStoreManagerImpl::Init( |
| 159 mojom::PersistentPrefStoreConfigurationPtr configuration) { |
| 160 DCHECK(!persistent_pref_store_); |
| 161 |
| 162 persistent_pref_store_ = |
| 163 CreatePersistentPrefStore(std::move(configuration), worker_pool_.get()); |
| 164 DCHECK(persistent_pref_store_); |
| 165 for (auto& request : pending_persistent_pref_store_requests_) { |
| 166 persistent_pref_store_bindings_.AddBinding(persistent_pref_store_.get(), |
| 167 std::move(request)); |
| 168 } |
| 169 pending_persistent_pref_store_requests_.clear(); |
| 170 } |
| 171 |
122 void PrefStoreManagerImpl::OnStart() {} | 172 void PrefStoreManagerImpl::OnStart() {} |
123 | 173 |
124 bool PrefStoreManagerImpl::OnConnect( | 174 bool PrefStoreManagerImpl::OnConnect( |
125 const service_manager::ServiceInfo& remote_info, | 175 const service_manager::ServiceInfo& remote_info, |
126 service_manager::InterfaceRegistry* registry) { | 176 service_manager::InterfaceRegistry* registry) { |
127 registry->AddInterface<prefs::mojom::PrefStoreConnector>(this); | 177 registry->AddInterface<prefs::mojom::PrefStoreConnector>(this); |
128 registry->AddInterface<prefs::mojom::PrefStoreRegistry>(this); | 178 registry->AddInterface<prefs::mojom::PrefStoreRegistry>(this); |
| 179 registry->AddInterface<prefs::mojom::PersistentPrefStoreConnector>(this); |
| 180 registry->AddInterface<prefs::mojom::PrefServiceControl>(this); |
129 return true; | 181 return true; |
130 } | 182 } |
131 | 183 |
132 void PrefStoreManagerImpl::OnPrefStoreDisconnect( | 184 void PrefStoreManagerImpl::OnPrefStoreDisconnect( |
133 PrefValueStore::PrefStoreType type) { | 185 PrefValueStore::PrefStoreType type) { |
134 DVLOG(1) << "Deregistering pref store: " << type; | 186 DVLOG(1) << "Deregistering pref store: " << type; |
135 pref_store_ptrs_.erase(type); | 187 pref_store_ptrs_.erase(type); |
136 } | 188 } |
137 | 189 |
138 bool PrefStoreManagerImpl::AllConnected() const { | 190 bool PrefStoreManagerImpl::AllConnected() const { |
139 return pref_store_ptrs_.size() == expected_pref_stores_.size(); | 191 return pref_store_ptrs_.size() == expected_pref_stores_.size(); |
140 } | 192 } |
141 | 193 |
142 } // namespace prefs | 194 } // namespace prefs |
OLD | NEW |