1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #ifndef DISCOVERY_MDNS_MDNS_SERVICE_IMPL_H_ 6*3f982cf4SFabien Sanglard #define DISCOVERY_MDNS_MDNS_SERVICE_IMPL_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <memory> 9*3f982cf4SFabien Sanglard 10*3f982cf4SFabien Sanglard #include "discovery/common/config.h" 11*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_domain_confirmed_provider.h" 12*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_probe_manager.h" 13*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_publisher.h" 14*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_querier.h" 15*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_random.h" 16*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_reader.h" 17*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_receiver.h" 18*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_records.h" 19*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_responder.h" 20*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_sender.h" 21*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_writer.h" 22*3f982cf4SFabien Sanglard #include "discovery/mdns/public/mdns_constants.h" 23*3f982cf4SFabien Sanglard #include "discovery/mdns/public/mdns_service.h" 24*3f982cf4SFabien Sanglard #include "platform/api/udp_socket.h" 25*3f982cf4SFabien Sanglard 26*3f982cf4SFabien Sanglard namespace openscreen { 27*3f982cf4SFabien Sanglard 28*3f982cf4SFabien Sanglard class TaskRunner; 29*3f982cf4SFabien Sanglard 30*3f982cf4SFabien Sanglard namespace discovery { 31*3f982cf4SFabien Sanglard 32*3f982cf4SFabien Sanglard class NetworkConfig; 33*3f982cf4SFabien Sanglard class ReportingClient; 34*3f982cf4SFabien Sanglard 35*3f982cf4SFabien Sanglard class MdnsServiceImpl : public MdnsService, public UdpSocket::Client { 36*3f982cf4SFabien Sanglard public: 37*3f982cf4SFabien Sanglard // |task_runner|, |reporting_client|, and |config| must exist for the duration 38*3f982cf4SFabien Sanglard // of this instance's life. 39*3f982cf4SFabien Sanglard MdnsServiceImpl(TaskRunner* task_runner, 40*3f982cf4SFabien Sanglard ClockNowFunctionPtr now_function, 41*3f982cf4SFabien Sanglard ReportingClient* reporting_client, 42*3f982cf4SFabien Sanglard const Config& config, 43*3f982cf4SFabien Sanglard const InterfaceInfo& network_info); 44*3f982cf4SFabien Sanglard ~MdnsServiceImpl() override; 45*3f982cf4SFabien Sanglard 46*3f982cf4SFabien Sanglard // MdnsService Overrides. 47*3f982cf4SFabien Sanglard void StartQuery(const DomainName& name, 48*3f982cf4SFabien Sanglard DnsType dns_type, 49*3f982cf4SFabien Sanglard DnsClass dns_class, 50*3f982cf4SFabien Sanglard MdnsRecordChangedCallback* callback) override; 51*3f982cf4SFabien Sanglard void StopQuery(const DomainName& name, 52*3f982cf4SFabien Sanglard DnsType dns_type, 53*3f982cf4SFabien Sanglard DnsClass dns_class, 54*3f982cf4SFabien Sanglard MdnsRecordChangedCallback* callback) override; 55*3f982cf4SFabien Sanglard void ReinitializeQueries(const DomainName& name) override; 56*3f982cf4SFabien Sanglard Error StartProbe(MdnsDomainConfirmedProvider* callback, 57*3f982cf4SFabien Sanglard DomainName requested_name, 58*3f982cf4SFabien Sanglard IPAddress address) override; 59*3f982cf4SFabien Sanglard 60*3f982cf4SFabien Sanglard Error RegisterRecord(const MdnsRecord& record) override; 61*3f982cf4SFabien Sanglard Error UpdateRegisteredRecord(const MdnsRecord& old_record, 62*3f982cf4SFabien Sanglard const MdnsRecord& new_record) override; 63*3f982cf4SFabien Sanglard Error UnregisterRecord(const MdnsRecord& record) override; 64*3f982cf4SFabien Sanglard 65*3f982cf4SFabien Sanglard // UdpSocket::Client overrides. 66*3f982cf4SFabien Sanglard void OnError(UdpSocket* socket, Error error) override; 67*3f982cf4SFabien Sanglard void OnSendError(UdpSocket* socket, Error error) override; 68*3f982cf4SFabien Sanglard void OnRead(UdpSocket* socket, ErrorOr<UdpPacket> packet) override; 69*3f982cf4SFabien Sanglard void OnBound(UdpSocket* socket) override; 70*3f982cf4SFabien Sanglard 71*3f982cf4SFabien Sanglard private: 72*3f982cf4SFabien Sanglard TaskRunner* const task_runner_; 73*3f982cf4SFabien Sanglard ClockNowFunctionPtr now_function_; 74*3f982cf4SFabien Sanglard ReportingClient* const reporting_client_; 75*3f982cf4SFabien Sanglard 76*3f982cf4SFabien Sanglard MdnsRandom random_delay_; 77*3f982cf4SFabien Sanglard MdnsReceiver receiver_; 78*3f982cf4SFabien Sanglard 79*3f982cf4SFabien Sanglard // Sockets to send and receive mDNS data. 80*3f982cf4SFabien Sanglard NetworkInterfaceIndex interface_; 81*3f982cf4SFabien Sanglard std::unique_ptr<UdpSocket> socket_v4_; 82*3f982cf4SFabien Sanglard std::unique_ptr<UdpSocket> socket_v6_; 83*3f982cf4SFabien Sanglard 84*3f982cf4SFabien Sanglard // unique_ptrs are used for the below objects so that they can be initialized 85*3f982cf4SFabien Sanglard // in the body of the ctor, after send_socket is initialized. 86*3f982cf4SFabien Sanglard std::unique_ptr<MdnsSender> sender_; 87*3f982cf4SFabien Sanglard std::unique_ptr<MdnsQuerier> querier_; 88*3f982cf4SFabien Sanglard std::unique_ptr<MdnsProbeManagerImpl> probe_manager_; 89*3f982cf4SFabien Sanglard std::unique_ptr<MdnsPublisher> publisher_; 90*3f982cf4SFabien Sanglard std::unique_ptr<MdnsResponder> responder_; 91*3f982cf4SFabien Sanglard }; 92*3f982cf4SFabien Sanglard 93*3f982cf4SFabien Sanglard } // namespace discovery 94*3f982cf4SFabien Sanglard } // namespace openscreen 95*3f982cf4SFabien Sanglard 96*3f982cf4SFabien Sanglard #endif // DISCOVERY_MDNS_MDNS_SERVICE_IMPL_H_ 97