tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 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 | |
sammc | 939cdb5 | 2017-03-23 01:21:13 | [diff] [blame] | 5 | #ifndef SERVICES_PREFERENCES_PREF_STORE_MANAGER_IMPL_H_ |
| 6 | #define SERVICES_PREFERENCES_PREF_STORE_MANAGER_IMPL_H_ |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 7 | |
sammc | 4c08113 | 2017-03-12 23:35:33 | [diff] [blame] | 8 | #include <memory> |
| 9 | #include <set> |
| 10 | #include <unordered_map> |
| 11 | #include <vector> |
| 12 | |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 13 | #include "base/compiler_specific.h" |
| 14 | #include "base/macros.h" |
| 15 | #include "base/memory/ref_counted.h" |
| 16 | #include "components/prefs/pref_value_store.h" |
| 17 | #include "mojo/public/cpp/bindings/binding_set.h" |
Sam McNally | 11c6c8a | 2017-06-08 01:44:19 | [diff] [blame] | 18 | #include "mojo/public/cpp/bindings/strong_binding_set.h" |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 19 | #include "services/preferences/public/interfaces/preferences.mojom.h" |
ben | 58ef184b | 2017-04-07 22:52:41 | [diff] [blame] | 20 | #include "services/service_manager/public/cpp/binder_registry.h" |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 21 | #include "services/service_manager/public/cpp/service.h" |
| 22 | |
sammc | 4c08113 | 2017-03-12 23:35:33 | [diff] [blame] | 23 | namespace base { |
| 24 | class SequencedWorkerPool; |
| 25 | } |
| 26 | |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 27 | namespace prefs { |
Sam McNally | 11c6c8a | 2017-06-08 01:44:19 | [diff] [blame] | 28 | class SharedPrefRegistry; |
sammc | 4c08113 | 2017-03-12 23:35:33 | [diff] [blame] | 29 | class PersistentPrefStoreImpl; |
Sam McNally | 5c8104c | 2017-05-26 00:23:54 | [diff] [blame] | 30 | class ScopedPrefConnectionBuilder; |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 31 | |
| 32 | // This class mediates the connection of clients who wants to read preferences |
| 33 | // and the pref stores that store those preferences. Pref stores use the |
| 34 | // |PrefStoreRegistry| interface to register themselves with the manager and |
| 35 | // clients use the |PrefStoreConnector| interface to connect to these stores. |
ben | 2c386b2 | 2017-05-03 00:42:18 | [diff] [blame] | 36 | class PrefStoreManagerImpl : public mojom::PrefStoreRegistry, |
ben | 2c386b2 | 2017-05-03 00:42:18 | [diff] [blame] | 37 | public mojom::PrefServiceControl, |
| 38 | public service_manager::Service { |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 39 | public: |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 40 | // Only replies to Connect calls when all |expected_pref_stores| have |
tibell | 2961ff4 | 2017-04-06 05:31:16 | [diff] [blame] | 41 | // registered. |expected_pref_stores| must contain |
| 42 | // PrefValueStore::DEFAULT_STORE and PrefValueStore::USER_STORE for |
| 43 | // consistency, as the service always registers these |
| 44 | // internally. |worker_pool| is used for any I/O performed by the service. |
sammc | 939cdb5 | 2017-03-23 01:21:13 | [diff] [blame] | 45 | PrefStoreManagerImpl( |
| 46 | std::set<PrefValueStore::PrefStoreType> expected_pref_stores, |
| 47 | scoped_refptr<base::SequencedWorkerPool> worker_pool); |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 48 | ~PrefStoreManagerImpl() override; |
| 49 | |
| 50 | private: |
Sam McNally | 11c6c8a | 2017-06-08 01:44:19 | [diff] [blame] | 51 | class ConnectorConnection; |
| 52 | |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 53 | // mojom::PrefStoreRegistry: |
| 54 | void Register(PrefValueStore::PrefStoreType type, |
| 55 | mojom::PrefStorePtr pref_store_ptr) override; |
| 56 | |
ben | 2c386b2 | 2017-05-03 00:42:18 | [diff] [blame] | 57 | void BindPrefStoreConnectorRequest( |
| 58 | const service_manager::BindSourceInfo& source_info, |
| 59 | prefs::mojom::PrefStoreConnectorRequest request); |
| 60 | void BindPrefStoreRegistryRequest( |
| 61 | const service_manager::BindSourceInfo& source_info, |
| 62 | prefs::mojom::PrefStoreRegistryRequest request); |
| 63 | void BindPrefServiceControlRequest( |
| 64 | const service_manager::BindSourceInfo& source_info, |
| 65 | prefs::mojom::PrefServiceControlRequest request); |
sammc | 4c08113 | 2017-03-12 23:35:33 | [diff] [blame] | 66 | |
| 67 | // PrefServiceControl: |
| 68 | void Init(mojom::PersistentPrefStoreConfigurationPtr configuration) override; |
| 69 | |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 70 | // service_manager::Service: |
| 71 | void OnStart() override; |
ben | 2c36828d | 2017-05-02 04:09:01 | [diff] [blame] | 72 | void OnBindInterface(const service_manager::BindSourceInfo& source_info, |
ben | 58ef184b | 2017-04-07 22:52:41 | [diff] [blame] | 73 | const std::string& interface_name, |
| 74 | mojo::ScopedMessagePipeHandle interface_pipe) override; |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 75 | |
| 76 | // Called when a PrefStore previously registered using |Register| disconnects. |
| 77 | void OnPrefStoreDisconnect(PrefValueStore::PrefStoreType type); |
| 78 | |
sammc | 6a6b142 | 2017-03-26 23:06:07 | [diff] [blame] | 79 | void OnPersistentPrefStoreReady(); |
| 80 | |
Johan Tibell | dcf9a3a8 | 2017-06-01 01:01:13 | [diff] [blame] | 81 | // Has |Init| been called? |
| 82 | bool Initialized() const; |
| 83 | |
tibell | 2961ff4 | 2017-04-06 05:31:16 | [diff] [blame] | 84 | // PrefStores that need to register before replying to any Connect calls. This |
| 85 | // does not include the PersistentPrefStore, which is handled separately. |
sammc | 939cdb5 | 2017-03-23 01:21:13 | [diff] [blame] | 86 | std::set<PrefValueStore::PrefStoreType> expected_pref_stores_; |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 87 | |
| 88 | // Registered pref stores. |
tibell | 2961ff4 | 2017-04-06 05:31:16 | [diff] [blame] | 89 | std::unordered_map<PrefValueStore::PrefStoreType, mojom::PrefStorePtr> |
| 90 | pref_store_ptrs_; |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 91 | |
Sam McNally | 11c6c8a | 2017-06-08 01:44:19 | [diff] [blame] | 92 | mojo::StrongBindingSet<mojom::PrefStoreConnector> connector_bindings_; |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 93 | mojo::BindingSet<mojom::PrefStoreRegistry> registry_bindings_; |
sammc | 4c08113 | 2017-03-12 23:35:33 | [diff] [blame] | 94 | std::unique_ptr<PersistentPrefStoreImpl> persistent_pref_store_; |
sammc | 4c08113 | 2017-03-12 23:35:33 | [diff] [blame] | 95 | mojo::Binding<mojom::PrefServiceControl> init_binding_; |
| 96 | |
Johan Tibell | dcf9a3a8 | 2017-06-01 01:01:13 | [diff] [blame] | 97 | mojom::PrefStoreConnectorPtr incognito_connector_; |
| 98 | |
Sam McNally | 11c6c8a | 2017-06-08 01:44:19 | [diff] [blame] | 99 | const std::unique_ptr<SharedPrefRegistry> shared_pref_registry_; |
sammc | 6926632 | 2017-03-29 03:29:55 | [diff] [blame] | 100 | |
Sam McNally | 5c8104c | 2017-05-26 00:23:54 | [diff] [blame] | 101 | // The same |ScopedPrefConnectionBuilder| instance may appear multiple times |
| 102 | // in |pending_connections_|, once per type of pref store it's waiting for, |
| 103 | // and at most once in |pending_persistent_connections_|. |
| 104 | std::unordered_map<PrefValueStore::PrefStoreType, |
| 105 | std::vector<scoped_refptr<ScopedPrefConnectionBuilder>>> |
| 106 | pending_connections_; |
| 107 | std::vector<scoped_refptr<ScopedPrefConnectionBuilder>> |
| 108 | pending_persistent_connections_; |
Johan Tibell | dcf9a3a8 | 2017-06-01 01:01:13 | [diff] [blame] | 109 | std::vector<scoped_refptr<ScopedPrefConnectionBuilder>> |
| 110 | pending_incognito_connections_; |
Sam McNally | 5c8104c | 2017-05-26 00:23:54 | [diff] [blame] | 111 | |
sammc | 6926632 | 2017-03-29 03:29:55 | [diff] [blame] | 112 | const scoped_refptr<base::SequencedWorkerPool> worker_pool_; |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 113 | |
ben | 58ef184b | 2017-04-07 22:52:41 | [diff] [blame] | 114 | service_manager::BinderRegistry registry_; |
| 115 | |
tibell | 11141bd | 2017-03-10 00:16:29 | [diff] [blame] | 116 | DISALLOW_COPY_AND_ASSIGN(PrefStoreManagerImpl); |
| 117 | }; |
| 118 | |
| 119 | } // namespace prefs |
| 120 | |
sammc | 939cdb5 | 2017-03-23 01:21:13 | [diff] [blame] | 121 | #endif // SERVICES_PREFERENCES_PREF_STORE_MANAGER_IMPL_H_ |