| // Copyright 2014 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 PEERD_PEER_H_ |
| #define PEERD_PEER_H_ |
| |
| #include <map> |
| #include <string> |
| #include <vector> |
| |
| #include <stdint.h> |
| |
| #include <chromeos/dbus/dbus_object.h> |
| #include <chromeos/dbus/exported_property_set.h> |
| #include <chromeos/errors/error.h> |
| #include <gtest/gtest_prod.h> |
| |
| #include "peerd/ip_addr.h" |
| #include "peerd/service_publisher_interface.h" |
| #include "peerd/typedefs.h" |
| |
| namespace peerd { |
| |
| namespace errors { |
| namespace peer { |
| |
| extern const char kInvalidUUID[]; |
| extern const char kInvalidName[]; |
| extern const char kInvalidNote[]; |
| |
| } // namespace peer |
| } // namespace errors |
| |
| // Exposes a Peer interface over DBus. We use this class to represent |
| // ourself over DBus to interested viewers. We also use it to represent |
| // remote peers that we've discovered over various mediums. |
| class Peer { |
| public: |
| // Construct a Peer object and register it with DBus on the provided |
| // path. On error, nullptr is returned, and |error| is populated with |
| // meaningful error information. |
| static std::unique_ptr<Peer> MakePeer( |
| chromeos::ErrorPtr* error, |
| chromeos::dbus_utils::ExportedObjectManager* object_manager, |
| const dbus::ObjectPath& path, |
| const std::string& uuid, |
| const std::string& friendly_name, |
| const std::string& note, |
| uint64_t last_seen, |
| const CompletionAction& completion_callback); |
| |
| virtual ~Peer() = default; |
| |
| // Returns false on failure. |
| bool SetFriendlyName(chromeos::ErrorPtr* error, |
| const std::string& friendly_name); |
| // Returns false on failure. |
| bool SetNote(chromeos::ErrorPtr* error, const std::string& note); |
| void SetLastSeen(uint64_t last_seen); |
| // Add a service to be exported by this peer. Can fail if this peer |
| // is already advertising a service with |service_id| or if |service_id| |
| // and/or |service_info| are malformed. Returns false on error, and can |
| // optionally provide detailed error information in |error|. |
| bool AddService(chromeos::ErrorPtr* error, |
| const std::string& service_id, |
| const std::vector<ip_addr>& addresses, |
| const std::map<std::string, std::string>& service_info); |
| // Remove a service advertised by this peer. Can fail if no service with id |
| // |service_id| is in this peer. |
| bool RemoveService(chromeos::ErrorPtr* error, |
| const std::string& service_id); |
| |
| // Peer objects will notify ServicePublishers when services are added, |
| // updated, and removed. This is only used for the self instance of peer |
| // which represents ourselves to remote devices. If a publisher is added |
| // while this peer has existing services, this will trigger immediate |
| // advertisement of services on that publisher. |
| // |
| // The Peer will remove publishers implicitly when each publisher is |
| // destroyed. |
| void RegisterServicePublisher( |
| base::WeakPtr<ServicePublisherInterface> publisher); |
| |
| private: |
| Peer(std::unique_ptr<chromeos::dbus_utils::DBusObject> dbus_object, |
| const dbus::ObjectPath& service_path_prefix, |
| const std::string& uuid); |
| |
| void RegisterAsync(const CompletionAction& completion_callback); |
| |
| size_t services_added_{0}; |
| chromeos::dbus_utils::ExportedProperty<std::string> uuid_; |
| chromeos::dbus_utils::ExportedProperty<std::string> name_; |
| chromeos::dbus_utils::ExportedProperty<std::string> note_; |
| chromeos::dbus_utils::ExportedProperty<uint64_t> last_seen_; |
| std::unique_ptr<chromeos::dbus_utils::DBusObject> dbus_object_; |
| dbus::ObjectPath service_path_prefix_; |
| std::map<std::string, std::unique_ptr<Service>> services_; |
| std::vector<base::WeakPtr<ServicePublisherInterface>> publishers_; |
| |
| friend class PeerTest; |
| DISALLOW_COPY_AND_ASSIGN(Peer); |
| }; |
| |
| } // namespace peerd |
| |
| #endif // PEERD_PEER_H_ |