blob: cd6b2698b001cc35cc8f54d26d10d1871ba5dc60 [file] [log] [blame]
// 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.
#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 {
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& peer_id,
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,
const std::map<std::string, chromeos::Any>& options);
// Parses options for services being published by this device.
bool ParseOptions(chromeos::ErrorPtr* error,
const std::map<std::string, chromeos::Any>& options,
MDnsOptions* mdns_options_out);
// 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,
MDnsOptions* mdns_options_out);
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;
} // namespace peerd
#endif // PEERD_SERVICE_H_