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