esp8266ndn
NDN Arduino library for ESP8266 and more
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
transport.hpp
Go to the documentation of this file.
1#ifndef NDNPH_FACE_TRANSPORT_HPP
2#define NDNPH_FACE_TRANSPORT_HPP
3
4#include "../core/region.hpp"
5
6namespace ndnph {
7namespace transport {
8
10class Transport {
11public:
12 virtual ~Transport() = default;
13
15 bool isUp() const {
16 return doIsUp();
17 }
18
20 void loop() {
21 doLoop();
22 }
23
24 using RxCallback = void (*)(void* ctx, const uint8_t* pkt, size_t pktLen, uint64_t endpointId);
25
27 void setRxCallback(RxCallback cb, void* ctx) {
28 m_rxCb = cb;
29 m_rxCtx = ctx;
30 }
31
33 bool send(const uint8_t* pkt, size_t pktLen, uint64_t endpointId = 0) {
34 return doSend(pkt, pktLen, endpointId);
35 }
36
37protected:
39 void invokeRxCallback(const uint8_t* pkt, size_t pktLen, uint64_t endpointId = 0) {
40 m_rxCb(m_rxCtx, pkt, pktLen, endpointId);
41 }
42
43private:
44 virtual bool doIsUp() const = 0;
45
46 virtual void doLoop() = 0;
47
48 virtual bool doSend(const uint8_t* pkt, size_t pktLen, uint64_t endpointId) = 0;
49
50private:
51 RxCallback m_rxCb = nullptr;
52 void* m_rxCtx = nullptr;
53};
54
61class TransportWrap : public virtual Transport {
62protected:
64 : inner(inner) {
65 inner.setRxCallback(&TransportWrap::innerRx, this);
66 }
67
68private:
69 static void innerRx(void* self, const uint8_t* pkt, size_t pktLen, uint64_t endpointId) {
70 reinterpret_cast<TransportWrap*>(self)->handleRx(pkt, pktLen, endpointId);
71 }
72
73 virtual void handleRx(const uint8_t* pkt, size_t pktLen, uint64_t endpointId) {
74 invokeRxCallback(pkt, pktLen, endpointId);
75 }
76
77 bool doIsUp() const override {
78 return inner.isUp();
79 }
80
81 void doLoop() override {
82 inner.loop();
83 }
84
85 bool doSend(const uint8_t* pkt, size_t pktLen, uint64_t endpointId) override {
86 return inner.send(pkt, pktLen, endpointId);
87 }
88
89protected:
91};
92
93} // namespace transport
94
96
97} // namespace ndnph
98
99#endif // NDNPH_FACE_TRANSPORT_HPP
Wrap another transport.
Definition transport.hpp:61
TransportWrap(Transport &inner)
Definition transport.hpp:63
void doLoop() override
Definition transport.hpp:81
bool doSend(const uint8_t *pkt, size_t pktLen, uint64_t endpointId) override
Definition transport.hpp:85
bool doIsUp() const override
Definition transport.hpp:77
Transport & inner
Definition transport.hpp:90
virtual void handleRx(const uint8_t *pkt, size_t pktLen, uint64_t endpointId)
Definition transport.hpp:73
Base class of low-level transport.
Definition transport.hpp:10
virtual bool doSend(const uint8_t *pkt, size_t pktLen, uint64_t endpointId)=0
bool isUp() const
Determine whether transport is connected.
Definition transport.hpp:15
bool send(const uint8_t *pkt, size_t pktLen, uint64_t endpointId=0)
Synchronously transmit a packet.
Definition transport.hpp:33
virtual bool doIsUp() const =0
void loop()
Process periodical events, such as receiving packets.
Definition transport.hpp:20
void invokeRxCallback(const uint8_t *pkt, size_t pktLen, uint64_t endpointId=0)
Invoke incoming packet callback for a received packet.
Definition transport.hpp:39
void setRxCallback(RxCallback cb, void *ctx)
Set incoming packet callback.
Definition transport.hpp:27
void(*)(void *ctx, const uint8_t *pkt, size_t pktLen, uint64_t endpointId) RxCallback
Definition transport.hpp:24
virtual ~Transport()=default
Definition fs.hpp:33