106 lines
3.3 KiB
C++
106 lines
3.3 KiB
C++
// 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
|