MDNS/src/include/Network/Mdns/Server.h
Go to the documentation of this file.
1 /****
2  * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development.
3  * Created 2015 by Skurydin Alexey
4  * http://github.com/SmingHub/Sming
5  * All files of the Sming Core are provided under the LGPL v3 license.
6  *
7  * Server.h
8  *
9  * Code originally based on MrDunk's mDNS code distributed under the MIT license.
10  *
11  * MIT license: https://github.com/mrdunk/esp8266_mdns/blob/master/LICENCE.txt
12  *
13  * However, code has been essentially rewritten so Sming LGPL v3 license applies.
14  *
15  */
16 
17 #pragma once
18 
19 #include <Delegate.h>
20 #include <Network/UdpConnection.h>
21 #include "Request.h"
22 #include "Handler.h"
23 
24 namespace mDNS
25 {
29 class Server : protected UdpConnection
30 {
31 public:
36  using MessageDelegate = Delegate<bool(Message& message)>;
37 
42  using PacketDelegate = Delegate<bool(IpAddress remoteIP, uint16_t remotePort, const uint8_t* data, size_t length)>;
43 
44  ~Server();
45 
46  bool begin();
47 
48  void end();
49 
50  bool restart()
51  {
52  end();
53  return begin();
54  }
55 
60  void addHandler(Handler& handler)
61  {
62  handlers.add(&handler);
63  }
64 
69  void removeHandler(Handler& handler)
70  {
71  handlers.remove(&handler);
72  }
73 
78  void onSend(MessageDelegate callback)
79  {
80  sendCallback = callback;
81  }
82 
87  void onPacket(PacketDelegate callback)
88  {
89  packetCallback = callback;
90  }
91 
98  bool search(const String& hostname, ResourceType type = ResourceType::PTR);
99 
104  bool send(Message& message);
105 
106 protected:
107  void onReceive(pbuf* buf, IpAddress remoteIP, uint16_t remotePort) override;
108 
109 private:
110  /*
111  * Need a separate UDP connection for sending requests
112  */
113  class UdpOut : public UdpConnection
114  {
115  protected:
116  void onReceive(pbuf* buf, IpAddress remoteIP, uint16_t remotePort) override;
117  };
118 
119  Handler::List handlers;
120  MessageDelegate sendCallback;
121  PacketDelegate packetCallback;
122  UdpOut out;
123  bool active{false};
124 };
125 
126 extern Server server;
127 
128 } // namespace mDNS
bool remove(LinkedObject *object)
bool send(Message &message)
Send an mDNS message containing questions/answers.
Definition: UdpConnection.h:27
The String class.
Definition: WString.h:136
bool search(const String &hostname, ResourceType type=ResourceType::PTR)
Send a multicast query.
Server server
bool add(ObjectType *object)
Definition: LinkedObjectList.h:134
Definition: Answer.h:17
Delegate< bool(IpAddress remoteIP, uint16_t remotePort, const uint8_t *data, size_t length)> PacketDelegate
Callback to be invoked with raw data (debugging, etc.)
Definition: MDNS/src/include/Network/Mdns/Server.h:70
bool restart()
Definition: MDNS/src/include/Network/Mdns/Server.h:78
Delegate< bool(Message &message)> MessageDelegate
Callback to be invoked for each received message.
Definition: MDNS/src/include/Network/Mdns/Server.h:64
Type
Definition: Resource.h:41
Virtual base class used for chaining message handlers.
Definition: Libraries/MDNS/src/include/Network/Mdns/Handler.h:29
void addHandler(Handler &handler)
Set callback to be invoked for each received message.
Definition: MDNS/src/include/Network/Mdns/Server.h:88
A class to make it easier to handle and pass around IP addresses.
Definition: IpAddress.h:44
void removeHandler(Handler &handler)
Remove a message handler.
Definition: MDNS/src/include/Network/Mdns/Server.h:97
Definition: Delegate.h:20
void onPacket(PacketDelegate callback)
Set callback to be invoked for raw received data, before parsing.
Definition: MDNS/src/include/Network/Mdns/Server.h:115
Encapsulates a message packet for flexible introspection.
Definition: MDNS/src/include/Network/Mdns/Message.h:36
void onReceive(pbuf *buf, IpAddress remoteIP, uint16_t remotePort) override
void onSend(MessageDelegate callback)
Set callback to be invoked before sending a message.
Definition: MDNS/src/include/Network/Mdns/Server.h:106