| // Copyright 2020 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef FEDERATED_STORAGE_MANAGER_H_ |
| #define FEDERATED_STORAGE_MANAGER_H_ |
| |
| #include <memory> |
| #include <optional> |
| #include <string> |
| |
| #include <base/no_destructor.h> |
| #include <base/sequence_checker.h> |
| |
| #include "federated/example_database.h" |
| #include "federated/session_manager_observer_interface.h" |
| #include "federated/session_manager_proxy.h" |
| |
| namespace dbus { |
| class Bus; |
| } // namespace dbus |
| |
| namespace federated { |
| |
| class SessionManagerProxy; |
| |
| // Singleton class providing storage to satisfy federated service interface |
| // which receives new examples and federated computation interface which |
| // consumes examples for training/analytics. |
| class StorageManager : public SessionManagerObserverInterface { |
| public: |
| // Constructor is protected to disallow direct instantiation. |
| ~StorageManager() override; |
| |
| static StorageManager* GetInstance(); |
| |
| // Virtual for mocking. |
| virtual void InitializeSessionManagerProxy(dbus::Bus* bus); |
| virtual bool OnExampleReceived(const std::string& client_name, |
| const std::string& serialized_example); |
| virtual std::optional<ExampleDatabase::Iterator> GetExampleIterator( |
| const std::string& client_name) const; |
| |
| protected: |
| // NoDestructor needs access to constructor. |
| friend class base::NoDestructor<StorageManager>; |
| |
| StorageManager(); |
| StorageManager(const StorageManager&) = delete; |
| StorageManager& operator=(const StorageManager&) = delete; |
| |
| private: |
| friend class StorageManagerTest; |
| |
| void set_example_database_for_testing(ExampleDatabase* example_database) { |
| example_database_.reset(example_database); |
| } |
| |
| // SessionManagerObserverInterface: |
| void OnSessionStarted() override; |
| void OnSessionStopped() override; |
| |
| void ConnectToDatabaseIfNecessary(); |
| |
| // Session manager that notifies session state changes. |
| std::unique_ptr<SessionManagerProxy> session_manager_proxy_; |
| |
| // The database connection. |
| std::unique_ptr<ExampleDatabase> example_database_; |
| |
| // Current login user hash. The database is connected to |
| // /run/daemon-store/federated/<sanitized_username_>/examples.db. |
| std::string sanitized_username_; |
| |
| SEQUENCE_CHECKER(sequence_checker_); |
| }; |
| |
| } // namespace federated |
| |
| #endif // FEDERATED_STORAGE_MANAGER_H_ |