From 2d979ceb5111faafd2bc78dbaa8893ac36931875 Mon Sep 17 00:00:00 2001 From: lsalzman Date: Tue, 2 Oct 2012 13:33:07 +0300 Subject: [PATCH] intercept callback support --- include/enet/enet.h | 4 ++++ protocol.c | 20 +++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/enet/enet.h b/include/enet/enet.h index b3ad438..90fdbfd 100644 --- a/include/enet/enet.h +++ b/include/enet/enet.h @@ -319,6 +319,9 @@ typedef struct _ENetCompressor /** Callback that computes the checksum of the data held in buffers[0:bufferCount-1] */ typedef enet_uint32 (ENET_CALLBACK * ENetChecksumCallback) (const ENetBuffer * buffers, size_t bufferCount); + +/** Callback for intercepting received raw UDP packets. Should return 1 to intercept, 0 to ignore, or -1 to propagate an error. */ +typedef int (ENET_CALLBACK * ENetInterceptCallback) (ENetHost * host, ENetEvent * event); /** An ENet host for communicating with peers. * @@ -368,6 +371,7 @@ typedef struct _ENetHost enet_uint32 totalSentPackets; /**< total UDP packets sent, user should reset to 0 as needed to prevent overflow */ enet_uint32 totalReceivedData; /**< total data received, user should reset to 0 as needed to prevent overflow */ enet_uint32 totalReceivedPackets; /**< total UDP packets received, user should reset to 0 as needed to prevent overflow */ + ENetInterceptCallback intercept; /**< callback the user can set to intercept received raw UDP packets */ } ENetHost; /** diff --git a/protocol.c b/protocol.c index 2563513..c8c54fd 100644 --- a/protocol.c +++ b/protocol.c @@ -1194,7 +1194,25 @@ enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event) host -> totalReceivedData += receivedLength; host -> totalReceivedPackets ++; - + + if (host -> intercept != NULL) + { + switch (host -> intercept (host, event)) + { + case 1: + if (event != NULL && event -> type != ENET_EVENT_TYPE_NONE) + return 1; + + continue; + + case -1: + return -1; + + default: + break; + } + } + switch (enet_protocol_handle_incoming_commands (host, event)) { case 1: