xref: /aosp_15_r20/external/openscreen/discovery/mdns/mdns_receiver.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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_RECEIVER_H_
6*3f982cf4SFabien Sanglard #define DISCOVERY_MDNS_MDNS_RECEIVER_H_
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard #include <functional>
9*3f982cf4SFabien Sanglard 
10*3f982cf4SFabien Sanglard #include "discovery/common/config.h"
11*3f982cf4SFabien Sanglard #include "platform/api/udp_socket.h"
12*3f982cf4SFabien Sanglard #include "platform/base/error.h"
13*3f982cf4SFabien Sanglard #include "platform/base/udp_packet.h"
14*3f982cf4SFabien Sanglard 
15*3f982cf4SFabien Sanglard namespace openscreen {
16*3f982cf4SFabien Sanglard namespace discovery {
17*3f982cf4SFabien Sanglard 
18*3f982cf4SFabien Sanglard class MdnsMessage;
19*3f982cf4SFabien Sanglard 
20*3f982cf4SFabien Sanglard class MdnsReceiver {
21*3f982cf4SFabien Sanglard  public:
22*3f982cf4SFabien Sanglard   class ResponseClient {
23*3f982cf4SFabien Sanglard    public:
24*3f982cf4SFabien Sanglard     virtual ~ResponseClient();
25*3f982cf4SFabien Sanglard 
26*3f982cf4SFabien Sanglard     virtual void OnMessageReceived(const MdnsMessage& message) = 0;
27*3f982cf4SFabien Sanglard   };
28*3f982cf4SFabien Sanglard 
29*3f982cf4SFabien Sanglard   // MdnsReceiver does not own |socket| and |delegate|
30*3f982cf4SFabien Sanglard   // and expects that the lifetime of these objects exceeds the lifetime of
31*3f982cf4SFabien Sanglard   // MdnsReceiver.
32*3f982cf4SFabien Sanglard   explicit MdnsReceiver(Config config);
33*3f982cf4SFabien Sanglard   MdnsReceiver(const MdnsReceiver& other) = delete;
34*3f982cf4SFabien Sanglard   MdnsReceiver(MdnsReceiver&& other) noexcept = delete;
35*3f982cf4SFabien Sanglard   MdnsReceiver& operator=(const MdnsReceiver& other) = delete;
36*3f982cf4SFabien Sanglard   MdnsReceiver& operator=(MdnsReceiver&& other) noexcept = delete;
37*3f982cf4SFabien Sanglard   ~MdnsReceiver();
38*3f982cf4SFabien Sanglard 
39*3f982cf4SFabien Sanglard   void SetQueryCallback(
40*3f982cf4SFabien Sanglard       std::function<void(const MdnsMessage&, const IPEndpoint& src)> callback);
41*3f982cf4SFabien Sanglard   void AddResponseCallback(ResponseClient* callback);
42*3f982cf4SFabien Sanglard   void RemoveResponseCallback(ResponseClient* callback);
43*3f982cf4SFabien Sanglard 
44*3f982cf4SFabien Sanglard   // The receiver can be started and stopped multiple times.
45*3f982cf4SFabien Sanglard   // Start and Stop are both synchronous calls. When MdnsReceiver has not yet
46*3f982cf4SFabien Sanglard   // been started, OnRead callbacks it receives from the task runner will be
47*3f982cf4SFabien Sanglard   // no-ops.
48*3f982cf4SFabien Sanglard   void Start();
49*3f982cf4SFabien Sanglard   void Stop();
50*3f982cf4SFabien Sanglard 
51*3f982cf4SFabien Sanglard   void OnRead(UdpSocket* socket, ErrorOr<UdpPacket> packet);
52*3f982cf4SFabien Sanglard 
53*3f982cf4SFabien Sanglard  private:
54*3f982cf4SFabien Sanglard   enum class State {
55*3f982cf4SFabien Sanglard     kStopped,
56*3f982cf4SFabien Sanglard     kRunning,
57*3f982cf4SFabien Sanglard   };
58*3f982cf4SFabien Sanglard 
59*3f982cf4SFabien Sanglard   std::function<void(const MdnsMessage&, const IPEndpoint& src)>
60*3f982cf4SFabien Sanglard       query_callback_;
61*3f982cf4SFabien Sanglard   State state_ = State::kStopped;
62*3f982cf4SFabien Sanglard 
63*3f982cf4SFabien Sanglard   std::vector<ResponseClient*> response_clients_;
64*3f982cf4SFabien Sanglard 
65*3f982cf4SFabien Sanglard   Config config_;
66*3f982cf4SFabien Sanglard };
67*3f982cf4SFabien Sanglard 
68*3f982cf4SFabien Sanglard }  // namespace discovery
69*3f982cf4SFabien Sanglard }  // namespace openscreen
70*3f982cf4SFabien Sanglard 
71*3f982cf4SFabien Sanglard #endif  // DISCOVERY_MDNS_MDNS_RECEIVER_H_
72