esp8266ndn
NDN Arduino library for ESP8266 and more
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
segment-consumer.hpp
Go to the documentation of this file.
1#ifndef NDNPH_APP_SEGMENT_CONSUMER_HPP
2#define NDNPH_APP_SEGMENT_CONSUMER_HPP
3
4#include "../face/packet-handler.hpp"
5#include "../keychain/null.hpp"
6#include "../port/clock/port.hpp"
7
8namespace ndnph {
9
11public:
12 struct Options {
14
16 int retxLimit = 5;
17
19 int retxDelay = 500;
20 };
21
27 explicit SegmentConsumerBase(Face& face, Options opts)
28 : PacketHandler(face)
29 , m_opts(std::move(opts))
30 , m_pending(this) {}
31
32 explicit SegmentConsumerBase(Face& face)
33 : SegmentConsumerBase(face, Options()) {}
34
46 using SegmentCallback = void (*)(void* ctx, uint64_t segment, Data data);
47
53 void setSegmentCallback(SegmentCallback cb, void* ctx) {
54 m_cb = cb;
55 m_cbCtx = ctx;
56 }
57
59 class SaveDest {
60 public:
61 explicit SaveDest(uint8_t* output, size_t limit)
62 : output(output)
63 , limit(limit) {}
64
65 static void accumulate(void* self0, uint64_t, Data data) {
66 reinterpret_cast<SaveDest*>(self0)->accumulate(data);
67 }
68
69 private:
70 void accumulate(Data data) {
71 if (hasError || !data) {
72 hasError = true;
73 return;
74 }
75 auto content = data.getContent();
76 if (length + content.size() > limit) {
77 hasError = true;
78 return;
79 }
80 std::copy(content.begin(), content.end(), &output[length]);
81 length += content.size();
83 }
84
85 public:
86 uint8_t* output = nullptr;
87 size_t limit = 0;
88 size_t length = 0;
89 bool isCompleted = false;
90 bool hasError = false;
91 };
92
100 void saveTo(SaveDest& dest) {
102 }
103
109 void start(Name prefix) {
110 m_prefix = prefix;
111 m_running = true;
112 m_segment = 0;
115 }
116
122 void stop() {
123 m_running = false;
124 }
125
127 bool isRunning() const {
128 return m_running;
129 }
130
131protected:
132 void invokeCallback(Data data) {
133 if (m_cb != nullptr) {
134 m_cb(m_cbCtx, m_segment, data);
135 }
136 }
137
138protected:
141 void* m_cbCtx = nullptr;
143 uint64_t m_segment = 0;
146 bool m_running = false;
147};
148
154template<typename SegmentConvention = convention::Segment, size_t regionCap = 1024>
156public:
158
159private:
160 void loop() final {
161 if (!m_running || !m_pending.expired()) {
162 return;
163 }
164
165 if (--m_retxRemain < -1) {
166 m_running = false;
168 return;
169 }
170
172 Interest interest = region.template create<Interest>();
173 NDNPH_ASSERT(!!interest);
174 interest.setName(m_prefix.append(region, SegmentConvention(), m_segment));
175 m_pending.send(interest, m_opts.retxDelay);
176 }
177
178 bool processData(Data data) final {
180 Name interestName = m_prefix.append(region, SegmentConvention(), m_segment);
181 if (!m_pending.match(data, interestName, false) || !data.verify(m_opts.verifier)) {
182 return false;
183 }
184
185 invokeCallback(data);
186
187 if (data.getIsFinalBlock()) {
188 m_running = false;
189 } else {
190 ++m_segment;
193 }
194 return true;
195 }
196};
197
199
200} // namespace ndnph
201
202#endif // NDNPH_APP_SEGMENT_CONSUMER_HPP
Consumer of segmented object, using a stop-and-wait algorithm.
Definition segment-consumer.hpp:155
bool processData(Data data) final
Override to receive Data packets.
Definition segment-consumer.hpp:178
void loop() final
Override to be invoked periodically.
Definition segment-consumer.hpp:160
Data packet.
Definition data.hpp:136
bool getIsFinalBlock() const
Definition data.hpp:164
tlv::Value getContent() const
Definition data.hpp:172
bool verify(const PublicKey &key) const
Verify the packet with a public key.
Definition data.hpp:263
Network layer face.
Definition face.hpp:12
Interest packet.
Definition interest.hpp:284
void setName(const Name &v)
Definition interest.hpp:288
Name.
Definition name.hpp:14
Name append(Region &region, const C &... comps) const
Append a sequence of components.
Definition name.hpp:183
static const NullKey & get()
Definition null.hpp:22
Helper to keep track an outgoing pending Interest.
Definition packet-handler.hpp:125
bool expired() const
Determine if the pending Interest has expired / timed out.
Definition packet-handler.hpp:208
bool match(const Data &data, const Interest &interest) const
Check Interest-Data match.
Definition packet-handler.hpp:182
void expireNow()
Set expire time to now.
Definition packet-handler.hpp:203
bool send(const Packet &interest, int timeout, Arg &&... arg)
Send an Interest.
Definition packet-handler.hpp:141
Base class to receive packets from Face.
Definition packet-handler.hpp:10
Public key.
Definition public-key.hpp:9
Destination and context of saving accumulated payload.
Definition segment-consumer.hpp:59
size_t limit
Definition segment-consumer.hpp:87
size_t length
Definition segment-consumer.hpp:88
bool isCompleted
Definition segment-consumer.hpp:89
SaveDest(uint8_t *output, size_t limit)
Definition segment-consumer.hpp:61
static void accumulate(void *self0, uint64_t, Data data)
Definition segment-consumer.hpp:65
uint8_t * output
Definition segment-consumer.hpp:86
bool hasError
Definition segment-consumer.hpp:90
Definition segment-consumer.hpp:10
SegmentConsumerBase(Face &face, Options opts)
Constructor.
Definition segment-consumer.hpp:27
void setSegmentCallback(SegmentCallback cb, void *ctx)
Assign SegmentCallback.
Definition segment-consumer.hpp:53
SegmentCallback m_cb
Definition segment-consumer.hpp:140
bool isRunning() const
Determine whether fetching is in progress (not completed or failed).
Definition segment-consumer.hpp:127
void(*)(void *ctx, uint64_t segment, Data data) SegmentCallback
Callback upon segment arrival.
Definition segment-consumer.hpp:46
void * m_cbCtx
Definition segment-consumer.hpp:141
void invokeCallback(Data data)
Definition segment-consumer.hpp:132
Options m_opts
Definition segment-consumer.hpp:139
Name m_prefix
Definition segment-consumer.hpp:142
int m_retxRemain
Definition segment-consumer.hpp:145
bool m_running
Definition segment-consumer.hpp:146
void saveTo(SaveDest &dest)
Save content to destination.
Definition segment-consumer.hpp:100
SegmentConsumerBase(Face &face)
Definition segment-consumer.hpp:32
uint64_t m_segment
Definition segment-consumer.hpp:143
void start(Name prefix)
Start fetching content under given prefix.
Definition segment-consumer.hpp:109
OutgoingPendingInterest m_pending
Definition segment-consumer.hpp:144
void stop()
Stop fetching.
Definition segment-consumer.hpp:122
Region with statically allocated memory.
Definition region.hpp:143
#define NDNPH_ASSERT(x)
Definition common.hpp:30
Definition fs.hpp:33
Definition segment-consumer.hpp:12
int retxLimit
Maximum retransmission of an Interest, not counting initial Interest.
Definition segment-consumer.hpp:16
int retxDelay
Delay in milliseconds before retransmission.
Definition segment-consumer.hpp:19
const PublicKey & verifier
Definition segment-consumer.hpp:13