Bläddra i källkod

core: added support for multiple tcp_closed callbacks

Nikolay Ivanuschak 5 månader sedan
förälder
incheckning
2873637af8
2 ändrade filer med 16 tillägg och 7 borttagningar
  1. 15 6
      src/core/events.c
  2. 1 1
      src/core/events.h

+ 15 - 6
src/core/events.c

@@ -209,9 +209,13 @@ int sr_event_register_cb(int type, sr_event_cb_f f)
 				return -1;
 			break;
 		case SREV_TCP_CLOSED:
-			if(_sr_events_list.tcp_closed == 0)
-				_sr_events_list.tcp_closed = f;
-			else
+			for(i = 0; i < SREV_CB_LIST_SIZE; i++) {
+				if(_sr_events_list.tcp_closed[i] == 0) {
+					_sr_events_list.tcp_closed[i] = f;
+					break;
+				}
+			}
+			if(i == SREV_CB_LIST_SIZE)
 				return -1;
 			break;
 		case SREV_NET_DATA_RECV:
@@ -372,8 +376,13 @@ int sr_event_exec(int type, sr_event_param_t *evp)
 			} else
 				return 1;
 		case SREV_TCP_CLOSED:
-			if(unlikely(_sr_events_list.tcp_closed != 0)) {
-				ret = _sr_events_list.tcp_closed(evp);
+			if(unlikely(_sr_events_list.tcp_closed[0] != 0)) {
+				ret = 0;
+				for(i = 0;
+						i < SREV_CB_LIST_SIZE && _sr_events_list.tcp_closed[i];
+						i++) {
+					ret |= _sr_events_list.tcp_closed[i](evp);
+				}
 				return ret;
 			} else
 				return 1;
@@ -449,7 +458,7 @@ int sr_event_enabled(int type)
 		case SREV_RCV_NOSIP:
 			return (_sr_events_list.rcv_nosip != 0) ? 1 : 0;
 		case SREV_TCP_CLOSED:
-			return (_sr_events_list.tcp_closed != 0) ? 1 : 0;
+			return (_sr_events_list.tcp_closed[0] != 0) ? 1 : 0;
 		case SREV_NET_DATA_RECV:
 			return (_sr_events_list.net_data_recv != 0) ? 1 : 0;
 		case SREV_NET_DATA_SENT:

+ 1 - 1
src/core/events.h

@@ -70,7 +70,7 @@ typedef struct sr_event_cb
 	sr_event_cb_f tcp_ws_frame_out;
 	sr_event_cb_f stun_in;
 	sr_event_cb_f rcv_nosip;
-	sr_event_cb_f tcp_closed;
+	sr_event_cb_f tcp_closed[SREV_CB_LIST_SIZE];
 	sr_event_cb_f net_data_recv;
 	sr_event_cb_f net_data_sent;
 	sr_event_cb_f sip_reply_out[SREV_CB_LIST_SIZE];