@@ -134,10 +134,73 @@ void NetworkEvents::checkForEvent() {
134
134
free (event);
135
135
}
136
136
137
+ uint32_t NetworkEvents::findEvent (NetworkEventCb cbEvent, arduino_event_id_t event) {
138
+ uint32_t i;
139
+
140
+ if (!cbEvent) {
141
+ return cbEventList.size ();
142
+ }
143
+
144
+ for (i = 0 ; i < cbEventList.size (); i++) {
145
+ NetworkEventCbList_t entry = cbEventList[i];
146
+ if (entry.cb == cbEvent && entry.event == event) {
147
+ break ;
148
+ }
149
+ }
150
+ return i;
151
+ }
152
+
153
+ template <typename T, typename ... U> static size_t getStdFunctionAddress (std::function<T(U...)> f) {
154
+ typedef T (fnType)(U...);
155
+ fnType **fnPointer = f.template target <fnType *>();
156
+ if (fnPointer != nullptr ) {
157
+ return (size_t )*fnPointer;
158
+ }
159
+ return (size_t )fnPointer;
160
+ }
161
+
162
+ uint32_t NetworkEvents::findEvent (NetworkEventFuncCb cbEvent, arduino_event_id_t event) {
163
+ uint32_t i;
164
+
165
+ if (!cbEvent) {
166
+ return cbEventList.size ();
167
+ }
168
+
169
+ for (i = 0 ; i < cbEventList.size (); i++) {
170
+ NetworkEventCbList_t entry = cbEventList[i];
171
+ if (getStdFunctionAddress (entry.fcb ) == getStdFunctionAddress (cbEvent) && entry.event == event) {
172
+ break ;
173
+ }
174
+ }
175
+ return i;
176
+ }
177
+
178
+ uint32_t NetworkEvents::findEvent (NetworkEventSysCb cbEvent, arduino_event_id_t event) {
179
+ uint32_t i;
180
+
181
+ if (!cbEvent) {
182
+ return cbEventList.size ();
183
+ }
184
+
185
+ for (i = 0 ; i < cbEventList.size (); i++) {
186
+ NetworkEventCbList_t entry = cbEventList[i];
187
+ if (entry.scb == cbEvent && entry.event == event) {
188
+ break ;
189
+ }
190
+ }
191
+ return i;
192
+ }
193
+
137
194
network_event_handle_t NetworkEvents::onEvent (NetworkEventCb cbEvent, arduino_event_id_t event) {
138
195
if (!cbEvent) {
139
196
return 0 ;
140
197
}
198
+
199
+ if (findEvent (cbEvent, event) < cbEventList.size ()) {
200
+ log_w (" Attempt to add duplicate event handler!" );
201
+ return 0 ;
202
+ }
203
+
141
204
NetworkEventCbList_t newEventHandler;
142
205
newEventHandler.cb = cbEvent;
143
206
newEventHandler.fcb = NULL ;
@@ -151,6 +214,12 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventFuncCb cbEvent, arduin
151
214
if (!cbEvent) {
152
215
return 0 ;
153
216
}
217
+
218
+ if (findEvent (cbEvent, event) < cbEventList.size ()) {
219
+ log_w (" Attempt to add duplicate event handler!" );
220
+ return 0 ;
221
+ }
222
+
154
223
NetworkEventCbList_t newEventHandler;
155
224
newEventHandler.cb = NULL ;
156
225
newEventHandler.fcb = cbEvent;
@@ -164,6 +233,12 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventSysCb cbEvent, arduino
164
233
if (!cbEvent) {
165
234
return 0 ;
166
235
}
236
+
237
+ if (findEvent (cbEvent, event) < cbEventList.size ()) {
238
+ log_w (" Attempt to add duplicate event handler!" );
239
+ return 0 ;
240
+ }
241
+
167
242
NetworkEventCbList_t newEventHandler;
168
243
newEventHandler.cb = NULL ;
169
244
newEventHandler.fcb = NULL ;
@@ -177,6 +252,12 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventCb cbEvent, arduino
177
252
if (!cbEvent) {
178
253
return 0 ;
179
254
}
255
+
256
+ if (findEvent (cbEvent, event) < cbEventList.size ()) {
257
+ log_w (" Attempt to add duplicate event handler!" );
258
+ return 0 ;
259
+ }
260
+
180
261
NetworkEventCbList_t newEventHandler;
181
262
newEventHandler.cb = cbEvent;
182
263
newEventHandler.fcb = NULL ;
@@ -190,6 +271,12 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventFuncCb cbEvent, ard
190
271
if (!cbEvent) {
191
272
return 0 ;
192
273
}
274
+
275
+ if (findEvent (cbEvent, event) < cbEventList.size ()) {
276
+ log_w (" Attempt to add duplicate event handler!" );
277
+ return 0 ;
278
+ }
279
+
193
280
NetworkEventCbList_t newEventHandler;
194
281
newEventHandler.cb = NULL ;
195
282
newEventHandler.fcb = cbEvent;
@@ -203,6 +290,12 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, ardu
203
290
if (!cbEvent) {
204
291
return 0 ;
205
292
}
293
+
294
+ if (findEvent (cbEvent, event) < cbEventList.size ()) {
295
+ log_w (" Attempt to add duplicate event handler!" );
296
+ return 0 ;
297
+ }
298
+
206
299
NetworkEventCbList_t newEventHandler;
207
300
newEventHandler.cb = NULL ;
208
301
newEventHandler.fcb = NULL ;
@@ -213,60 +306,62 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, ardu
213
306
}
214
307
215
308
void NetworkEvents::removeEvent (NetworkEventCb cbEvent, arduino_event_id_t event) {
309
+ uint32_t i;
310
+
216
311
if (!cbEvent) {
217
312
return ;
218
313
}
219
314
220
- for (uint32_t i = 0 ; i < cbEventList.size (); i++) {
221
- NetworkEventCbList_t entry = cbEventList[i];
222
- if (entry.cb == cbEvent && entry.event == event) {
223
- cbEventList.erase (cbEventList.begin () + i);
224
- }
315
+ i = findEvent (cbEvent, event);
316
+ if (i >= cbEventList.size ()) {
317
+ log_w (" Event handler not found!" );
318
+ return ;
225
319
}
226
- }
227
320
228
- template <typename T, typename ... U> static size_t getStdFunctionAddress (std::function<T(U...)> f) {
229
- typedef T (fnType)(U...);
230
- fnType **fnPointer = f.template target <fnType *>();
231
- if (fnPointer != nullptr ) {
232
- return (size_t )*fnPointer;
233
- }
234
- return (size_t )fnPointer;
321
+ cbEventList.erase (cbEventList.begin () + i);
235
322
}
236
323
237
324
void NetworkEvents::removeEvent (NetworkEventFuncCb cbEvent, arduino_event_id_t event) {
325
+ uint32_t i;
326
+
238
327
if (!cbEvent) {
239
328
return ;
240
329
}
241
330
242
- for (uint32_t i = 0 ; i < cbEventList.size (); i++) {
243
- NetworkEventCbList_t entry = cbEventList[i];
244
- if (getStdFunctionAddress (entry.fcb ) == getStdFunctionAddress (cbEvent) && entry.event == event) {
245
- cbEventList.erase (cbEventList.begin () + i);
246
- }
331
+ i = findEvent (cbEvent, event);
332
+ if (i >= cbEventList.size ()) {
333
+ log_w (" Event handler not found!" );
334
+ return ;
247
335
}
336
+
337
+ cbEventList.erase (cbEventList.begin () + i);
248
338
}
249
339
250
340
void NetworkEvents::removeEvent (NetworkEventSysCb cbEvent, arduino_event_id_t event) {
341
+ uint32_t i;
342
+
251
343
if (!cbEvent) {
252
344
return ;
253
345
}
254
346
255
- for (uint32_t i = 0 ; i < cbEventList.size (); i++) {
256
- NetworkEventCbList_t entry = cbEventList[i];
257
- if (entry.scb == cbEvent && entry.event == event) {
258
- cbEventList.erase (cbEventList.begin () + i);
259
- }
347
+ i = findEvent (cbEvent, event);
348
+ if (i >= cbEventList.size ()) {
349
+ log_w (" Event handler not found!" );
350
+ return ;
260
351
}
352
+
353
+ cbEventList.erase (cbEventList.begin () + i);
261
354
}
262
355
263
356
void NetworkEvents::removeEvent (network_event_handle_t id) {
264
357
for (uint32_t i = 0 ; i < cbEventList.size (); i++) {
265
358
NetworkEventCbList_t entry = cbEventList[i];
266
359
if (entry.id == id) {
267
360
cbEventList.erase (cbEventList.begin () + i);
361
+ return ;
268
362
}
269
363
}
364
+ log_w (" Event handler not found!" );
270
365
}
271
366
272
367
int NetworkEvents::setStatusBits (int bits) {
0 commit comments