blob: c9f56562c0f5f33874ce2834595e509f6538a5c5 [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
sammc4c081132017-03-12 23:35:3322namespace base {
23class SequencedWorkerPool;
24}
25
tibell11141bd2017-03-10 00:16:2926namespace prefs {
sammc4c081132017-03-12 23:35:3327class PersistentPrefStoreImpl;
tibell11141bd2017-03-10 00:16:2928
29// This class mediates the connection of clients who wants to read preferences
30// and the pref stores that store those preferences. Pref stores use the
31// |PrefStoreRegistry| interface to register themselves with the manager and
32// clients use the |PrefStoreConnector| interface to connect to these stores.
33class PrefStoreManagerImpl
34 : public mojom::PrefStoreRegistry,
35 public mojom::PrefStoreConnector,
36 public service_manager::InterfaceFactory<mojom::PrefStoreConnector>,
37 public service_manager::InterfaceFactory<mojom::PrefStoreRegistry>,
sammc4c081132017-03-12 23:35:3338 public service_manager::InterfaceFactory<
39 mojom::PersistentPrefStoreConnector>,
40 public mojom::PrefServiceControl,
41 public service_manager::InterfaceFactory<mojom::PrefServiceControl>,
tibell11141bd2017-03-10 00:16:2942 public service_manager::Service {
43 public:
tibell11141bd2017-03-10 00:16:2944 // Only replies to Connect calls when all |expected_pref_stores| have
45 // registered.
sammc939cdb52017-03-23 01:21:1346 PrefStoreManagerImpl(
47 std::set<PrefValueStore::PrefStoreType> expected_pref_stores,
48 scoped_refptr<base::SequencedWorkerPool> worker_pool);
tibell11141bd2017-03-10 00:16:2949 ~PrefStoreManagerImpl() override;
50
51 private:
52 using PrefStorePtrs =
53 std::unordered_map<PrefValueStore::PrefStoreType, mojom::PrefStorePtr>;
54
55 // mojom::PrefStoreRegistry:
56 void Register(PrefValueStore::PrefStoreType type,
57 mojom::PrefStorePtr pref_store_ptr) override;
58
59 // mojom::PrefStoreConnector:
60 void Connect(const ConnectCallback& callback) override;
61
62 // service_manager::InterfaceFactory<PrefStoreConnector>:
63 void Create(const service_manager::Identity& remote_identity,
64 prefs::mojom::PrefStoreConnectorRequest request) override;
65
66 // service_manager::InterfaceFactory<PrefStoreRegistry>:
67 void Create(const service_manager::Identity& remote_identity,
68 prefs::mojom::PrefStoreRegistryRequest request) override;
69
sammc4c081132017-03-12 23:35:3370 // service_manager::InterfaceFactory<PersistentPrefStoreConnector>:
71 void Create(
72 const service_manager::Identity& remote_identity,
73 prefs::mojom::PersistentPrefStoreConnectorRequest request) override;
74
75 // service_manager::InterfaceFactory<PrefServiceControl>:
76 void Create(const service_manager::Identity& remote_identity,
77 prefs::mojom::PrefServiceControlRequest request) override;
78
79 // PrefServiceControl:
80 void Init(mojom::PersistentPrefStoreConfigurationPtr configuration) override;
81
tibell11141bd2017-03-10 00:16:2982 // service_manager::Service:
83 void OnStart() override;
84 bool OnConnect(const service_manager::ServiceInfo& remote_info,
85 service_manager::InterfaceRegistry* registry) override;
86
87 // Called when a PrefStore previously registered using |Register| disconnects.
88 void OnPrefStoreDisconnect(PrefValueStore::PrefStoreType type);
89
90 // Have all the expected PrefStores connected?
91 bool AllConnected() const;
92
93 // PrefStores that need to register before replying to any Connect calls.
sammc939cdb52017-03-23 01:21:1394 std::set<PrefValueStore::PrefStoreType> expected_pref_stores_;
tibell11141bd2017-03-10 00:16:2995
96 // Registered pref stores.
97 PrefStorePtrs pref_store_ptrs_;
98
tibelld993a772017-03-22 22:52:5499 // We hold on to the connection request callbacks until all expected
100 // PrefStores have registered.
101 std::vector<ConnectCallback> pending_callbacks_;
102
tibell11141bd2017-03-10 00:16:29103 mojo::BindingSet<mojom::PrefStoreConnector> connector_bindings_;
104 mojo::BindingSet<mojom::PrefStoreRegistry> registry_bindings_;
sammc4c081132017-03-12 23:35:33105 std::unique_ptr<PersistentPrefStoreImpl> persistent_pref_store_;
106 mojo::BindingSet<mojom::PersistentPrefStoreConnector>
107 persistent_pref_store_bindings_;
108 mojo::Binding<mojom::PrefServiceControl> init_binding_;
109
110 // Requests made to connect to the service before it has been initialized.
111 // These will be handled when initialization completes.
112 std::vector<mojom::PersistentPrefStoreConnectorRequest>
113 pending_persistent_pref_store_requests_;
114
115 scoped_refptr<base::SequencedWorkerPool> worker_pool_;
tibell11141bd2017-03-10 00:16:29116
tibell11141bd2017-03-10 00:16:29117 DISALLOW_COPY_AND_ASSIGN(PrefStoreManagerImpl);
118};
119
120} // namespace prefs
121
sammc939cdb52017-03-23 01:21:13122#endif // SERVICES_PREFERENCES_PREF_STORE_MANAGER_IMPL_H_