Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "services/preferences/public/cpp/pref_store_manager_impl.h" | |
| 6 | |
| 7 #include "base/memory/ref_counted.h" | |
| 8 #include "components/prefs/pref_value_store.h" | |
| 9 #include "mojo/public/cpp/bindings/interface_request.h" | |
| 10 #include "services/service_manager/public/cpp/interface_registry.h" | |
| 11 | |
| 12 namespace prefs { | |
| 13 | |
| 14 class PrefStoreManagerImpl::ConnectionBarrier | |
|
Sam McNally
2017/02/24 04:14:53
Why is this nested?
tibell
2017/02/27 00:02:54
Done.
| |
| 15 : public base::RefCounted<ConnectionBarrier> { | |
| 16 public: | |
| 17 ConnectionBarrier(const PrefStorePtrs& pref_store_ptrs, | |
| 18 const ConnectCallback& callback); | |
| 19 | |
| 20 private: | |
| 21 friend class base::RefCounted<ConnectionBarrier>; | |
| 22 ~ConnectionBarrier(); | |
| 23 | |
| 24 void OnConnect(PrefValueStore::PrefStoreType type, | |
| 25 mojom::PrefStoreConnectionPtr connection_ptr); | |
| 26 | |
| 27 ConnectCallback callback_; | |
| 28 | |
| 29 std::unordered_map<PrefValueStore::PrefStoreType, | |
| 30 mojom::PrefStoreConnectionPtr> | |
| 31 connections_; | |
| 32 | |
| 33 const size_t expected_connections_; | |
| 34 | |
| 35 DISALLOW_COPY_AND_ASSIGN(ConnectionBarrier); | |
| 36 }; | |
| 37 | |
| 38 PrefStoreManagerImpl::ConnectionBarrier::ConnectionBarrier( | |
| 39 const PrefStorePtrs& pref_store_ptrs, | |
| 40 const ConnectCallback& callback) | |
| 41 : callback_(callback), expected_connections_(pref_store_ptrs.size()) { | |
| 42 for (const auto& ptr : pref_store_ptrs) { | |
| 43 ptr.second->AddObserver( | |
|
Sam McNally
2017/02/24 04:14:53
This is perilous if the first ptr is closed. RefCo
tibell
2017/02/27 00:02:54
Done.
| |
| 44 base::Bind(&ConnectionBarrier::OnConnect, this, ptr.first)); | |
| 45 } | |
| 46 } | |
| 47 | |
| 48 PrefStoreManagerImpl::ConnectionBarrier::~ConnectionBarrier() = default; | |
| 49 | |
| 50 // static | |
| 51 PrefStoreManagerImpl::PrefStoreTypes PrefStoreManagerImpl::DefaultStores() { | |
| 52 return {PrefValueStore::MANAGED_STORE}; | |
|
Sam McNally
2017/02/24 04:14:53
Is this correct?
tibell
2017/02/27 00:02:54
It's temporary in two senses:
1) I'm messing with
| |
| 53 } | |
| 54 | |
| 55 void PrefStoreManagerImpl::ConnectionBarrier::OnConnect( | |
|
Sam McNally
2017/02/24 04:14:53
This should be above DefaultStores().
tibell
2017/02/27 00:02:54
Done.
| |
| 56 PrefValueStore::PrefStoreType type, | |
| 57 mojom::PrefStoreConnectionPtr connection_ptr) { | |
| 58 connections_.insert(std::make_pair(type, std::move(connection_ptr))); | |
| 59 if (connections_.size() == expected_connections_) { | |
| 60 // After this method exits |this| will get destroyed so it's safe to move | |
| 61 // out the map. | |
| 62 callback_.Run(std::move(connections_)); | |
| 63 } | |
| 64 } | |
| 65 | |
| 66 PrefStoreManagerImpl::PrefStoreManagerImpl(PrefStoreTypes expected_pref_stores) | |
| 67 : expected_pref_stores_(std::move(expected_pref_stores)) {} | |
| 68 | |
| 69 PrefStoreManagerImpl::~PrefStoreManagerImpl() = default; | |
| 70 | |
| 71 void PrefStoreManagerImpl::Register(mojom::PrefStorePtr pref_store_ptr, | |
| 72 PrefValueStore::PrefStoreType type) { | |
| 73 if (expected_pref_stores_.count(type) == 0) { | |
| 74 LOG(WARNING) << "Not registering unexpected pref store: " << type; | |
| 75 return; | |
| 76 } | |
| 77 DVLOG(1) << "Registering pref store: " << type; | |
| 78 if (!pref_store_ptrs_.insert(std::make_pair(type, std::move(pref_store_ptr))) | |
| 79 .second) { | |
| 80 DLOG(FATAL) << "The same pref store registered twice: " << type; | |
| 81 } | |
| 82 if (AllConnected()) { | |
| 83 DVLOG(1) << "All pref stores registered."; | |
| 84 if (!pending_callbacks_.empty()) { | |
| 85 for (const auto& callback : pending_callbacks_) | |
| 86 make_scoped_refptr(new ConnectionBarrier(pref_store_ptrs_, callback)); | |
| 87 pending_callbacks_.clear(); | |
| 88 } | |
| 89 } | |
| 90 } | |
| 91 | |
| 92 void PrefStoreManagerImpl::Connect(const ConnectCallback& callback) { | |
| 93 if (AllConnected()) | |
| 94 make_scoped_refptr(new ConnectionBarrier(pref_store_ptrs_, callback)); | |
| 95 else | |
| 96 pending_callbacks_.push_back(callback); | |
| 97 } | |
| 98 | |
| 99 void PrefStoreManagerImpl::Create( | |
| 100 const service_manager::Identity& remote_identity, | |
| 101 prefs::mojom::PrefStoreConnectorRequest request) { | |
| 102 connector_bindings_.AddBinding(this, std::move(request)); | |
| 103 } | |
| 104 | |
| 105 void PrefStoreManagerImpl::Create( | |
| 106 const service_manager::Identity& remote_identity, | |
| 107 prefs::mojom::PrefStoreRegistryRequest request) { | |
| 108 registry_bindings_.AddBinding(this, std::move(request)); | |
| 109 } | |
| 110 | |
| 111 void PrefStoreManagerImpl::OnStart() {} | |
| 112 | |
| 113 bool PrefStoreManagerImpl::OnConnect( | |
| 114 const service_manager::ServiceInfo& remote_info, | |
| 115 service_manager::InterfaceRegistry* registry) { | |
| 116 registry->AddInterface<prefs::mojom::PrefStoreConnector>(this); | |
| 117 registry->AddInterface<prefs::mojom::PrefStoreRegistry>(this); | |
| 118 return true; | |
| 119 } | |
| 120 | |
| 121 bool PrefStoreManagerImpl::AllConnected() const { | |
| 122 return pref_store_ptrs_.size() == expected_pref_stores_.size(); | |
| 123 } | |
| 124 | |
| 125 } // namespace prefs | |
| OLD | NEW |