blob: 2a7822023e137ab06790d10394012658ba06e38e [file] [log] [blame]
tibell11141bd2017-03-10 00:16:291// 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
sammc939cdb52017-03-23 01:21:135#ifndef SERVICES_PREFERENCES_PREF_STORE_MANAGER_IMPL_H_
6#define SERVICES_PREFERENCES_PREF_STORE_MANAGER_IMPL_H_
tibell11141bd2017-03-10 00:16:297
sammc4c081132017-03-12 23:35:338#include <memory>
9#include <set>
10#include <unordered_map>
11#include <vector>
12
tibell11141bd2017-03-10 00:16:2913#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"
18#include "services/preferences/public/interfaces/preferences.mojom.h"
19#include "services/service_manager/public/cpp/interface_factory.h"
20#include "services/service_manager/public/cpp/service.h"
21
sammc69266322017-03-29 03:29:5522class DefaultPrefStore;
23
sammc4c081132017-03-12 23:35:3324namespace base {
25class SequencedWorkerPool;
26}
27
tibell11141bd2017-03-10 00:16:2928namespace prefs {
sammc4c081132017-03-12 23:35:3329class PersistentPrefStoreImpl;
sammc69266322017-03-29 03:29:5530class PrefStoreImpl;
tibell11141bd2017-03-10 00:16:2931
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.
36class PrefStoreManagerImpl
37 : public mojom::PrefStoreRegistry,
38 public mojom::PrefStoreConnector,
39 public service_manager::InterfaceFactory<mojom::PrefStoreConnector>,
40 public service_manager::InterfaceFactory<mojom::PrefStoreRegistry>,
sammc4c081132017-03-12 23:35:3341 public mojom::PrefServiceControl,
42 public service_manager::InterfaceFactory<mojom::PrefServiceControl>,
tibell11141bd2017-03-10 00:16:2943 public service_manager::Service {
44 public:
tibell11141bd2017-03-10 00:16:2945 // Only replies to Connect calls when all |expected_pref_stores| have
46 // registered.
sammc939cdb52017-03-23 01:21:1347 PrefStoreManagerImpl(
48 std::set<PrefValueStore::PrefStoreType> expected_pref_stores,
49 scoped_refptr<base::SequencedWorkerPool> worker_pool);
tibell11141bd2017-03-10 00:16:2950 ~PrefStoreManagerImpl() override;
51
52 private:
53 using PrefStorePtrs =
54 std::unordered_map<PrefValueStore::PrefStoreType, mojom::PrefStorePtr>;
55
56 // mojom::PrefStoreRegistry:
57 void Register(PrefValueStore::PrefStoreType type,
58 mojom::PrefStorePtr pref_store_ptr) override;
59
60 // mojom::PrefStoreConnector:
sammc69266322017-03-29 03:29:5561 void Connect(mojom::PrefRegistryPtr pref_registry,
62 const ConnectCallback& callback) override;
tibell11141bd2017-03-10 00:16:2963
64 // service_manager::InterfaceFactory<PrefStoreConnector>:
65 void Create(const service_manager::Identity& remote_identity,
66 prefs::mojom::PrefStoreConnectorRequest request) override;
67
68 // service_manager::InterfaceFactory<PrefStoreRegistry>:
69 void Create(const service_manager::Identity& remote_identity,
70 prefs::mojom::PrefStoreRegistryRequest request) override;
71
sammc4c081132017-03-12 23:35:3372 // service_manager::InterfaceFactory<PrefServiceControl>:
73 void Create(const service_manager::Identity& remote_identity,
74 prefs::mojom::PrefServiceControlRequest request) override;
75
76 // PrefServiceControl:
77 void Init(mojom::PersistentPrefStoreConfigurationPtr configuration) override;
78
tibell11141bd2017-03-10 00:16:2979 // service_manager::Service:
80 void OnStart() override;
81 bool OnConnect(const service_manager::ServiceInfo& remote_info,
82 service_manager::InterfaceRegistry* registry) override;
83
84 // Called when a PrefStore previously registered using |Register| disconnects.
85 void OnPrefStoreDisconnect(PrefValueStore::PrefStoreType type);
86
87 // Have all the expected PrefStores connected?
88 bool AllConnected() const;
89
sammc6a6b1422017-03-26 23:06:0790 void ProcessPendingConnects();
91
sammc69266322017-03-29 03:29:5592 void ConnectImpl(mojom::PrefRegistryPtr pref_registry,
93 const ConnectCallback& callback);
sammc6a6b1422017-03-26 23:06:0794
95 void OnPersistentPrefStoreReady();
96
tibell11141bd2017-03-10 00:16:2997 // PrefStores that need to register before replying to any Connect calls.
sammc939cdb52017-03-23 01:21:1398 std::set<PrefValueStore::PrefStoreType> expected_pref_stores_;
tibell11141bd2017-03-10 00:16:2999
100 // Registered pref stores.
101 PrefStorePtrs pref_store_ptrs_;
102
tibelld993a772017-03-22 22:52:54103 // We hold on to the connection request callbacks until all expected
104 // PrefStores have registered.
sammc69266322017-03-29 03:29:55105 std::vector<std::pair<ConnectCallback, mojom::PrefRegistryPtr>>
106 pending_connects_;
tibelld993a772017-03-22 22:52:54107
tibell11141bd2017-03-10 00:16:29108 mojo::BindingSet<mojom::PrefStoreConnector> connector_bindings_;
109 mojo::BindingSet<mojom::PrefStoreRegistry> registry_bindings_;
sammc4c081132017-03-12 23:35:33110 std::unique_ptr<PersistentPrefStoreImpl> persistent_pref_store_;
sammc4c081132017-03-12 23:35:33111 mojo::Binding<mojom::PrefServiceControl> init_binding_;
112
sammc69266322017-03-29 03:29:55113 const scoped_refptr<DefaultPrefStore> defaults_;
114 const std::unique_ptr<PrefStoreImpl> defaults_wrapper_;
115
116 const scoped_refptr<base::SequencedWorkerPool> worker_pool_;
tibell11141bd2017-03-10 00:16:29117
tibell11141bd2017-03-10 00:16:29118 DISALLOW_COPY_AND_ASSIGN(PrefStoreManagerImpl);
119};
120
121} // namespace prefs
122
sammc939cdb52017-03-23 01:21:13123#endif // SERVICES_PREFERENCES_PREF_STORE_MANAGER_IMPL_H_