| // 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_SERVICE_H_ |
| #define PEERD_SERVICE_H_ |
| |
| #include <map> |
| #include <string> |
| #include <vector> |
| |
| #include <base/macros.h> |
| #include <chromeos/dbus/dbus_object.h> |
| #include <chromeos/dbus/exported_property_set.h> |
| #include <chromeos/errors/error.h> |
| |
| #include "peerd/dbus_data_serialization.h" |
| #include "peerd/ip_addr.h" |
| #include "peerd/typedefs.h" |
| |
| namespace peerd { |
| |
| namespace errors { |
| namespace service { |
| |
| extern const char kInvalidServiceId[]; |
| extern const char kInvalidServiceInfo[]; |
| |
| } // namespace service |
| } // namespace errors |
| |
| // Exposes a Service over DBus. This class is used to represent |
| // services exposed by the local device as well as remote devices. |
| class Service { |
| public: |
| using ServiceInfo = std::map<std::string, std::string>; |
| using IpAddresses = std::vector<ip_addr>; |
| |
| static bool IsValidServiceId(chromeos::ErrorPtr* error, |
| const std::string& service_id); |
| static bool IsValidServiceInfo(chromeos::ErrorPtr* error, |
| const ServiceInfo& service_info); |
| |
| // For mDNS we'll encode each key/value pair as an entry in the TXT |
| // record. The max length there is 254 bytes + 1 byte to encode the |
| // length of the key/value. |
| static const size_t kMaxServiceInfoPairLength = 254; |
| // mDNS forbids service types longer than 15 characters. |
| static const size_t kMaxServiceIdLength = 15; |
| |
| Service(const scoped_refptr<dbus::Bus>& bus, |
| chromeos::dbus_utils::ExportedObjectManager* object_manager, |
| const dbus::ObjectPath& path); |
| bool RegisterAsync( |
| chromeos::ErrorPtr* error, |
| const std::string& service_id, |
| const IpAddresses& addresses, |
| const ServiceInfo& service_info, |
| const CompletionAction& completion_callback); |
| virtual ~Service() = default; |
| |
| // Getters called by publishers. |
| const std::string& GetServiceId() const; |
| const IpAddresses& GetIpAddresses() const; |
| const ServiceInfo& GetServiceInfo() const; |
| |
| // Update fields of this service. If any field is found to be invalid, the |
| // entire update is discarded. Returns true if update is applied. |
| bool Update(chromeos::ErrorPtr* error, |
| const IpAddresses& addresses, |
| const ServiceInfo& info); |
| |
| private: |
| chromeos::dbus_utils::ExportedProperty<std::string> service_id_; |
| chromeos::dbus_utils::ExportedProperty<IpAddresses> ip_addresses_; |
| chromeos::dbus_utils::ExportedProperty<ServiceInfo> service_info_; |
| std::unique_ptr<chromeos::dbus_utils::DBusObject> dbus_object_; |
| |
| friend class AvahiServicePublisherTest; |
| friend class ServiceTest; |
| DISALLOW_COPY_AND_ASSIGN(Service); |
| }; |
| |
| } // namespace peerd |
| |
| #endif // PEERD_SERVICE_H_ |