// 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 #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 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 socket_v4_; std::unique_ptr 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 sender_; std::unique_ptr querier_; std::unique_ptr probe_manager_; std::unique_ptr publisher_; std::unique_ptr responder_; }; } // namespace discovery } // namespace openscreen #endif // DISCOVERY_MDNS_MDNS_SERVICE_IMPL_H_