blob: e1c1522676d707f6c62826fb2c5d5775d3903fbf [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.
#ifndef DISCOVERY_MDNS_MDNS_SERVICE_IMPL_H_
#define DISCOVERY_MDNS_MDNS_SERVICE_IMPL_H_
#include <memory>
#include "discovery/common/config.h"
#include "discovery/mdns/mdns_domain_confirmed_provider.h"
#include "discovery/mdns/mdns_probe_manager.h"
#include "discovery/mdns/mdns_publisher.h"
#include "discovery/mdns/mdns_querier.h"
#include "discovery/mdns/mdns_random.h"
#include "discovery/mdns/mdns_reader.h"
#include "discovery/mdns/mdns_receiver.h"
#include "discovery/mdns/mdns_records.h"
#include "discovery/mdns/mdns_responder.h"
#include "discovery/mdns/mdns_sender.h"
#include "discovery/mdns/mdns_writer.h"
#include "discovery/mdns/public/mdns_constants.h"
#include "discovery/mdns/public/mdns_service.h"
#include "platform/api/udp_socket.h"
namespace openscreen {
class TaskRunner;
namespace discovery {
class NetworkConfig;
class ReportingClient;
class MdnsServiceImpl : public MdnsService, public UdpSocket::Client {
public:
// |task_runner|, |reporting_client|, and |config| must exist for the duration
// of this instance's life.
MdnsServiceImpl(TaskRunner* task_runner,
ClockNowFunctionPtr now_function,
ReportingClient* reporting_client,
const Config& config,
const Config::NetworkInfo& network_info);
~MdnsServiceImpl() override;
// MdnsService Overrides.
void StartQuery(const DomainName& name,
DnsType dns_type,
DnsClass dns_class,
MdnsRecordChangedCallback* callback) override;
void StopQuery(const DomainName& name,
DnsType dns_type,
DnsClass dns_class,
MdnsRecordChangedCallback* callback) override;
void ReinitializeQueries(const DomainName& name) override;
Error StartProbe(MdnsDomainConfirmedProvider* callback,
DomainName requested_name,
IPAddress address) override;
Error RegisterRecord(const MdnsRecord& record) override;
Error UpdateRegisteredRecord(const MdnsRecord& old_record,
const MdnsRecord& new_record) override;
Error UnregisterRecord(const MdnsRecord& record) override;
// UdpSocket::Client overrides.
void OnError(UdpSocket* socket, Error error) override;
void OnSendError(UdpSocket* socket, Error error) override;
void OnRead(UdpSocket* socket, ErrorOr<UdpPacket> packet) override;
void OnBound(UdpSocket* socket) override;
private:
TaskRunner* const task_runner_;
ClockNowFunctionPtr now_function_;
ReportingClient* const reporting_client_;
MdnsRandom random_delay_;
MdnsReceiver receiver_;
// Sockets to send and receive mDNS data.
NetworkInterfaceIndex interface_;
std::unique_ptr<UdpSocket> socket_v4_;
std::unique_ptr<UdpSocket> socket_v6_;
// unique_ptrs are used for the below objects so that they can be initialized
// in the body of the ctor, after send_socket is initialized.
std::unique_ptr<MdnsSender> sender_;
std::unique_ptr<MdnsQuerier> querier_;
std::unique_ptr<MdnsProbeManagerImpl> probe_manager_;
std::unique_ptr<MdnsPublisher> publisher_;
std::unique_ptr<MdnsResponder> responder_;
};
} // namespace discovery
} // namespace openscreen
#endif // DISCOVERY_MDNS_MDNS_SERVICE_IMPL_H_