| // 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 <tuple> |
| #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/org.chromium.peerd.Service.h" |
| #include "peerd/typedefs.h" |
| |
| namespace peerd { |
| |
| namespace errors { |
| namespace service { |
| |
| extern const char kInvalidServiceId[]; |
| extern const char kInvalidServiceInfo[]; |
| extern const char kInvalidServiceOptions[]; |
| |
| } // 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 org::chromium::peerd::ServiceInterface { |
| public: |
| using ServiceInfo = std::map<std::string, std::string>; |
| using IpAddress = std::tuple<std::vector<uint8_t>, uint16_t>; |
| using IpAddresses = std::vector<IpAddress>; |
| struct MDnsOptions { |
| uint16_t port = 0; |
| }; |
| |
| 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 std::map<std::string, chromeos::Any>& options, |
| const CompletionAction& completion_callback); |
| virtual ~Service() = default; |
| |
| // Getters called by publishers. |
| std::string GetServiceId() const; |
| IpAddresses GetIpAddresses() const; |
| ServiceInfo GetServiceInfo() const; |
| const MDnsOptions& GetMDnsOptions() 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: |
| // Parses options for services being published by this device. |
| bool ParseOptions(chromeos::ErrorPtr* error, |
| const std::map<std::string, chromeos::Any>& options); |
| // Checks that |maybe_mdns_options| is a map<string, Any> and then removes |
| // values from that dictionary. Stores the appropriate parsed values into |
| // |mdns_options_|. |
| bool ExtractMDnsOptions(chromeos::ErrorPtr* error, |
| chromeos::Any* maybe_mdns_options); |
| |
| |
| org::chromium::peerd::ServiceAdaptor dbus_adaptor_{this}; |
| std::unique_ptr<chromeos::dbus_utils::DBusObject> dbus_object_; |
| MDnsOptions parsed_mdns_options_; |
| |
| friend class AvahiServicePublisherTest; |
| friend class ServiceTest; |
| DISALLOW_COPY_AND_ASSIGN(Service); |
| }; |
| |
| } // namespace peerd |
| |
| #endif // PEERD_SERVICE_H_ |