| // Copyright 2015 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 LEADERD_MANAGER_H_ |
| #define LEADERD_MANAGER_H_ |
| |
| #include <map> |
| #include <set> |
| #include <string> |
| #include <tuple> |
| #include <vector> |
| |
| #include <base/macros.h> |
| #include <chromeos/dbus/async_event_sequencer.h> |
| |
| #include "leaderd/group.h" |
| #include "leaderd/org.chromium.leaderd.Manager.h" |
| #include "leaderd/peerd_client.h" |
| #include "leaderd/webserver_client.h" |
| |
| namespace chromeos { |
| namespace dbus_utils { |
| class ExportedObjectManager; |
| } // dbus_utils |
| } // chromeos |
| |
| namespace leaderd { |
| |
| // Manages global state of leaderd. |
| class Manager : public org::chromium::leaderd::ManagerInterface, |
| public WebServerClient::Delegate, |
| public PeerdClient::Delegate, |
| public Group::Delegate { |
| public: |
| Manager(const scoped_refptr<dbus::Bus>& bus, |
| chromeos::dbus_utils::ExportedObjectManager* object_manager, |
| std::unique_ptr<PeerdClient> peerd_client); |
| ~Manager(); |
| |
| void RegisterAsync(chromeos::dbus_utils::AsyncEventSequencer* sequencer); |
| |
| // Group::Delegate overrides. |
| void RemoveGroup(const std::string& group) override; |
| const std::string& GetUUID() const override; |
| std::vector<std::tuple<std::vector<uint8_t>, uint16_t>> GetIPInfo( |
| const std::string& peer_uuid) const override; |
| |
| // WebServerClient::Delegate overrides. |
| void SetWebServerPort(uint16_t port) override; |
| bool HandleLeaderDiscover(const std::string& group_id, |
| std::string* leader_id) override; |
| bool HandleLeaderChallenge(const std::string& group_id, |
| const std::string& challenger_id, |
| int32_t challenger_score, |
| std::string* leader_id, |
| std::string* responder_id) override; |
| bool HandleLeaderAnnouncement(const std::string& group_id, |
| const std::string& leader_id, |
| int32_t leader_score) override; |
| |
| // DBus handlers. |
| bool JoinGroup(chromeos::ErrorPtr* error, dbus::Message* message, |
| const std::string& group_id, |
| const std::map<std::string, chromeos::Any>& options, |
| dbus::ObjectPath* group_path) override; |
| std::string Ping() override; |
| |
| // PeerdClient::Delegate overrides. |
| void OnPeerdAvailable() override; |
| void OnPeerdDeath() override; |
| void OnSelfIdChanged(const std::string& uuid) override; |
| void OnPeerGroupsChanged(const std::string& uuid, |
| const std::set<std::string>& groups) override; |
| |
| private: |
| friend class ManagerTest; |
| void PublishService(); |
| |
| scoped_refptr<dbus::Bus> bus_; |
| org::chromium::leaderd::ManagerAdaptor dbus_adaptor_{this}; |
| chromeos::dbus_utils::DBusObject dbus_object_; |
| std::string uuid_; |
| std::unique_ptr<PeerdClient> peerd_client_; |
| // A mapping of group UUID to Group. |
| std::map<std::string, std::unique_ptr<Group>> groups_; |
| size_t last_group_dbus_id_{0}; |
| uint16_t web_port_; |
| |
| base::WeakPtrFactory<Manager> weak_ptr_factory_{this}; |
| DISALLOW_COPY_AND_ASSIGN(Manager); |
| }; |
| |
| } // namespace leaderd |
| |
| #endif // LEADERD_MANAGER_H_ |