@@ -134,10 +134,73 @@ void NetworkEvents::checkForEvent() {
134134 free (event);
135135}
136136
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+
137194network_event_handle_t NetworkEvents::onEvent (NetworkEventCb cbEvent, arduino_event_id_t event) {
138195 if (!cbEvent) {
139196 return 0 ;
140197 }
198+
199+ if (findEvent (cbEvent, event) < cbEventList.size ()) {
200+ log_w (" Attempt to add duplicate event handler!" );
201+ return 0 ;
202+ }
203+
141204 NetworkEventCbList_t newEventHandler;
142205 newEventHandler.cb = cbEvent;
143206 newEventHandler.fcb = NULL ;
@@ -151,6 +214,12 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventFuncCb cbEvent, arduin
151214 if (!cbEvent) {
152215 return 0 ;
153216 }
217+
218+ if (findEvent (cbEvent, event) < cbEventList.size ()) {
219+ log_w (" Attempt to add duplicate event handler!" );
220+ return 0 ;
221+ }
222+
154223 NetworkEventCbList_t newEventHandler;
155224 newEventHandler.cb = NULL ;
156225 newEventHandler.fcb = cbEvent;
@@ -164,6 +233,12 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventSysCb cbEvent, arduino
164233 if (!cbEvent) {
165234 return 0 ;
166235 }
236+
237+ if (findEvent (cbEvent, event) < cbEventList.size ()) {
238+ log_w (" Attempt to add duplicate event handler!" );
239+ return 0 ;
240+ }
241+
167242 NetworkEventCbList_t newEventHandler;
168243 newEventHandler.cb = NULL ;
169244 newEventHandler.fcb = NULL ;
@@ -177,6 +252,12 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventCb cbEvent, arduino
177252 if (!cbEvent) {
178253 return 0 ;
179254 }
255+
256+ if (findEvent (cbEvent, event) < cbEventList.size ()) {
257+ log_w (" Attempt to add duplicate event handler!" );
258+ return 0 ;
259+ }
260+
180261 NetworkEventCbList_t newEventHandler;
181262 newEventHandler.cb = cbEvent;
182263 newEventHandler.fcb = NULL ;
@@ -190,6 +271,12 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventFuncCb cbEvent, ard
190271 if (!cbEvent) {
191272 return 0 ;
192273 }
274+
275+ if (findEvent (cbEvent, event) < cbEventList.size ()) {
276+ log_w (" Attempt to add duplicate event handler!" );
277+ return 0 ;
278+ }
279+
193280 NetworkEventCbList_t newEventHandler;
194281 newEventHandler.cb = NULL ;
195282 newEventHandler.fcb = cbEvent;
@@ -203,6 +290,12 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, ardu
203290 if (!cbEvent) {
204291 return 0 ;
205292 }
293+
294+ if (findEvent (cbEvent, event) < cbEventList.size ()) {
295+ log_w (" Attempt to add duplicate event handler!" );
296+ return 0 ;
297+ }
298+
206299 NetworkEventCbList_t newEventHandler;
207300 newEventHandler.cb = NULL ;
208301 newEventHandler.fcb = NULL ;
@@ -213,60 +306,62 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, ardu
213306}
214307
215308void NetworkEvents::removeEvent (NetworkEventCb cbEvent, arduino_event_id_t event) {
309+ uint32_t i;
310+
216311 if (!cbEvent) {
217312 return ;
218313 }
219314
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 ;
225319 }
226- }
227320
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);
235322}
236323
237324void NetworkEvents::removeEvent (NetworkEventFuncCb cbEvent, arduino_event_id_t event) {
325+ uint32_t i;
326+
238327 if (!cbEvent) {
239328 return ;
240329 }
241330
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 ;
247335 }
336+
337+ cbEventList.erase (cbEventList.begin () + i);
248338}
249339
250340void NetworkEvents::removeEvent (NetworkEventSysCb cbEvent, arduino_event_id_t event) {
341+ uint32_t i;
342+
251343 if (!cbEvent) {
252344 return ;
253345 }
254346
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 ;
260351 }
352+
353+ cbEventList.erase (cbEventList.begin () + i);
261354}
262355
263356void NetworkEvents::removeEvent (network_event_handle_t id) {
264357 for (uint32_t i = 0 ; i < cbEventList.size (); i++) {
265358 NetworkEventCbList_t entry = cbEventList[i];
266359 if (entry.id == id) {
267360 cbEventList.erase (cbEventList.begin () + i);
361+ return ;
268362 }
269363 }
364+ log_w (" Event handler not found!" );
270365}
271366
272367int NetworkEvents::setStatusBits (int bits) {
0 commit comments