aboutsummaryrefslogtreecommitdiff
path: root/discovery/mdns/mdns_service_impl.h
blob: e1c1522676d707f6c62826fb2c5d5775d3903fbf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// 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_