| 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 |