xref: /aosp_15_r20/external/openscreen/discovery/mdns/mdns_service_impl.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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