blob: 7cc9ed41787d95a58920c277591d134bc14e749b [file] [log] [blame]
// Copyright 2019 The Chromium 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 "discovery/dnssd/public/dns_sd_instance_endpoint.h"
#include <algorithm>
#include <cctype>
#include <utility>
#include <vector>
#include "util/osp_logging.h"
namespace openscreen {
namespace discovery {
DnsSdInstanceEndpoint::DnsSdInstanceEndpoint(
std::string instance_id,
std::string service_id,
std::string domain_id,
DnsSdTxtRecord txt,
NetworkInterfaceIndex network_interface,
std::vector<IPEndpoint> endpoints)
: DnsSdInstanceEndpoint(std::move(instance_id),
std::move(service_id),
std::move(domain_id),
std::move(txt),
network_interface,
std::move(endpoints),
std::vector<Subtype>{}) {}
DnsSdInstanceEndpoint::DnsSdInstanceEndpoint(
std::string instance_id,
std::string service_id,
std::string domain_id,
DnsSdTxtRecord txt,
NetworkInterfaceIndex network_interface,
std::vector<IPEndpoint> endpoints,
std::vector<Subtype> subtypes)
: DnsSdInstance(std::move(instance_id),
std::move(service_id),
std::move(domain_id),
std::move(txt),
endpoints.empty() ? 0 : endpoints[0].port,
std::move(subtypes)),
endpoints_(std::move(endpoints)),
network_interface_(network_interface) {
InitializeEndpoints();
}
DnsSdInstanceEndpoint::DnsSdInstanceEndpoint(
DnsSdInstance instance,
NetworkInterfaceIndex network_interface,
std::vector<IPEndpoint> endpoints)
: DnsSdInstance(std::move(instance)),
endpoints_(std::move(endpoints)),
network_interface_(network_interface) {
InitializeEndpoints();
}
DnsSdInstanceEndpoint::DnsSdInstanceEndpoint(
const DnsSdInstanceEndpoint& other) = default;
DnsSdInstanceEndpoint::DnsSdInstanceEndpoint(DnsSdInstanceEndpoint&& other) =
default;
DnsSdInstanceEndpoint::~DnsSdInstanceEndpoint() = default;
DnsSdInstanceEndpoint& DnsSdInstanceEndpoint::operator=(
const DnsSdInstanceEndpoint& rhs) = default;
DnsSdInstanceEndpoint& DnsSdInstanceEndpoint::operator=(
DnsSdInstanceEndpoint&& rhs) = default;
void DnsSdInstanceEndpoint::InitializeEndpoints() {
OSP_CHECK(!endpoints_.empty());
std::sort(endpoints_.begin(), endpoints_.end());
for (const auto& endpoint : endpoints_) {
OSP_DCHECK_EQ(endpoint.port, port());
addresses_.push_back(endpoint.address);
}
}
bool operator<(const DnsSdInstanceEndpoint& lhs,
const DnsSdInstanceEndpoint& rhs) {
if (lhs.network_interface_ != rhs.network_interface_) {
return lhs.network_interface_ < rhs.network_interface_;
}
if (lhs.endpoints_.size() != rhs.endpoints_.size()) {
return lhs.endpoints_.size() < rhs.endpoints_.size();
}
for (int i = 0; i < static_cast<int>(lhs.endpoints_.size()); i++) {
if (lhs.endpoints_[i] != rhs.endpoints_[i]) {
return lhs.endpoints_[i] < rhs.endpoints_[i];
}
}
return static_cast<const DnsSdInstance&>(lhs) <
static_cast<const DnsSdInstance&>(rhs);
}
} // namespace discovery
} // namespace openscreen