| // 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_AVAHI_SERVICE_PUBLISHER_H_ |
| #define PEERD_AVAHI_SERVICE_PUBLISHER_H_ |
| |
| #include <map> |
| #include <stdint.h> |
| #include <string> |
| #include <vector> |
| |
| #include <base/macros.h> |
| #include <chromeos/errors/error.h> |
| #include <gtest/gtest_prod.h> |
| |
| #include "peerd/service.h" |
| #include "peerd/service_publisher_interface.h" |
| |
| namespace dbus { |
| class ObjectPath; |
| } // namespace dbus |
| |
| namespace peerd { |
| |
| namespace errors { |
| namespace avahi { |
| |
| extern const char kRemovedUnknownService[]; |
| extern const char kInvalidServiceId[]; |
| |
| } // namespace avahi |
| } // namespace errors |
| |
| class AvahiServicePublisher : public ServicePublisherInterface { |
| public: |
| AvahiServicePublisher(const std::string& lan_name, |
| const std::string& uuid, |
| const std::string& friendly_name, |
| const std::string& note, |
| const scoped_refptr<dbus::Bus>& bus, |
| dbus::ObjectProxy* avahi_proxy); |
| ~AvahiServicePublisher(); |
| base::WeakPtr<AvahiServicePublisher> GetWeakPtr(); |
| |
| // See comments in ServicePublisherInterface. |
| bool OnServiceUpdated(chromeos::ErrorPtr* error, |
| const Service& service) override; |
| bool OnServiceRemoved(chromeos::ErrorPtr* error, |
| const std::string& service_id) override; |
| bool OnFriendlyNameChanged(chromeos::ErrorPtr* error, |
| const std::string& name) override; |
| bool OnNoteChanged(chromeos::ErrorPtr* error, |
| const std::string& note) override; |
| |
| private: |
| using TxtRecord = std::vector<std::vector<uint8_t>>; |
| // Transform a service_info to a mDNS compatible TXT record value. |
| // Concretely, a TXT record consists of a list of strings in the format |
| // "key=value". Each string must be less than 256 bytes long, since they are |
| // length/value encoded. Keys may not contain '=' characters, but are |
| // otherwise unconstrained. |
| // |
| // We need a DBus type of "aay", which is a vector<vector<uint8_t>> in our |
| // bindings. |
| static TxtRecord GetTxtRecord(const Service::ServiceInfo& service); |
| |
| bool UpdateGroup(chromeos::ErrorPtr* error, |
| const std::string& service_id, |
| const Service::ServiceInfo& service_info); |
| // Attempts to add the given |service_id|/|service_info| pair to the |
| // given |group_proxy|. Returns true on success, false otherwise. |
| // Does no cleanup. |
| bool AddServiceToGroup(chromeos::ErrorPtr* error, |
| const std::string& service_id, |
| const Service::ServiceInfo& service_info, |
| dbus::ObjectProxy* group_proxy); |
| // Removes all records corresponding to the provided |group_proxy| and |
| // detaches from any related signals. |
| bool FreeGroup(chromeos::ErrorPtr* error, dbus::ObjectProxy* group_proxy); |
| // Update the master service listing to include the given |service_id|. |
| bool UpdateRootService(chromeos::ErrorPtr* error); |
| |
| |
| const std::string lan_unique_hostname_; |
| const std::string uuid_; |
| std::string friendly_name_; |
| std::string note_; |
| scoped_refptr<dbus::Bus> bus_; |
| dbus::ObjectProxy* avahi_proxy_; |
| std::map<std::string, dbus::ObjectProxy*> outstanding_groups_; |
| |
| // Should be last member to invalidate weak pointers in child objects |
| // (like avahi_proxy_) and avoid callbacks while partially destroyed. |
| base::WeakPtrFactory<AvahiServicePublisher> weak_ptr_factory_{this}; |
| FRIEND_TEST(AvahiServicePublisherTest, CanEncodeTxtRecords); |
| DISALLOW_COPY_AND_ASSIGN(AvahiServicePublisher); |
| }; |
| |
| } // namespace peerd |
| |
| #endif // PEERD_AVAHI_SERVICE_PUBLISHER_H_ |