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 
6 namespace ndnph {
7 namespace transport {
8 
10 class Transport {
11 public:
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 
37 protected:
39  void invokeRxCallback(const uint8_t* pkt, size_t pktLen, uint64_t endpointId = 0) {
40  m_rxCb(m_rxCtx, pkt, pktLen, endpointId);
41  }
42 
43 private:
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 
50 private:
51  RxCallback m_rxCb = nullptr;
52  void* m_rxCtx = nullptr;
53 };
54 
61 class TransportWrap : public virtual Transport {
62 protected:
64  : inner(inner) {
65  inner.setRxCallback(&TransportWrap::innerRx, this);
66  }
67 
68 private:
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 
89 protected:
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
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
transport::Transport Transport
Definition: transport.hpp:95