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