Added ability to set custom lossless packets in Messenger.

This commit is contained in:
irungentoo 2014-06-11 20:01:07 -04:00
parent 63f25f86d3
commit 4f2674eb0f
No known key found for this signature in database
GPG Key ID: 10349DC9BED89E98
2 changed files with 88 additions and 7 deletions

View File

@ -1658,14 +1658,13 @@ static int handle_custom_lossy_packet(void *object, int friend_num, uint8_t *pac
if (friend_not_valid(m, friend_num)) if (friend_not_valid(m, friend_num))
return 1; return 1;
if (m->friendlist[friend_num].packethandlers[packet[0] % PACKET_ID_LOSSY_RANGE_SIZE].function) if (m->friendlist[friend_num].lossy_packethandlers[packet[0] % PACKET_ID_LOSSY_RANGE_SIZE].function)
return m->friendlist[friend_num].packethandlers[packet[0] % PACKET_ID_LOSSY_RANGE_SIZE].function( return m->friendlist[friend_num].lossy_packethandlers[packet[0] % PACKET_ID_LOSSY_RANGE_SIZE].function(
m->friendlist[friend_num].packethandlers[packet[0] % PACKET_ID_LOSSY_RANGE_SIZE].object, packet, length); m->friendlist[friend_num].lossy_packethandlers[packet[0] % PACKET_ID_LOSSY_RANGE_SIZE].object, packet, length);
return 1; return 1;
} }
int custom_lossy_packet_registerhandler(Messenger *m, int32_t friendnumber, uint8_t byte, int custom_lossy_packet_registerhandler(Messenger *m, int32_t friendnumber, uint8_t byte,
int (*packet_handler_callback)(void *object, uint8_t *data, uint32_t len), void *object) int (*packet_handler_callback)(void *object, uint8_t *data, uint32_t len), void *object)
{ {
@ -1678,8 +1677,8 @@ int custom_lossy_packet_registerhandler(Messenger *m, int32_t friendnumber, uint
if (byte >= (PACKET_ID_LOSSY_RANGE_START + PACKET_ID_LOSSY_RANGE_SIZE)) if (byte >= (PACKET_ID_LOSSY_RANGE_START + PACKET_ID_LOSSY_RANGE_SIZE))
return -1; return -1;
m->friendlist[friendnumber].packethandlers[byte % PACKET_ID_LOSSY_RANGE_SIZE].function = packet_handler_callback; m->friendlist[friendnumber].lossy_packethandlers[byte % PACKET_ID_LOSSY_RANGE_SIZE].function = packet_handler_callback;
m->friendlist[friendnumber].packethandlers[byte % PACKET_ID_LOSSY_RANGE_SIZE].object = object; m->friendlist[friendnumber].lossy_packethandlers[byte % PACKET_ID_LOSSY_RANGE_SIZE].object = object;
return 0; return 0;
} }
@ -1697,6 +1696,57 @@ int send_custom_lossy_packet(Messenger *m, int32_t friendnumber, uint8_t *data,
return send_lossy_cryptpacket(m->net_crypto, m->friendlist[friendnumber].crypt_connection_id, data, length); return send_lossy_cryptpacket(m->net_crypto, m->friendlist[friendnumber].crypt_connection_id, data, length);
} }
static int handle_custom_lossless_packet(void *object, int friend_num, uint8_t *packet, uint16_t length)
{
Messenger *m = object;
if (friend_not_valid(m, friend_num))
return -1;
if (packet[0] < PACKET_ID_LOSSLESS_RANGE_START)
return -1;
if (packet[0] >= (PACKET_ID_LOSSLESS_RANGE_START + PACKET_ID_LOSSLESS_RANGE_SIZE))
return -1;
if (m->friendlist[friend_num].lossless_packethandlers[packet[0] % PACKET_ID_LOSSLESS_RANGE_SIZE].function)
return m->friendlist[friend_num].lossless_packethandlers[packet[0] % PACKET_ID_LOSSLESS_RANGE_SIZE].function(
m->friendlist[friend_num].lossless_packethandlers[packet[0] % PACKET_ID_LOSSLESS_RANGE_SIZE].object, packet, length);
return 1;
}
int custom_lossless_packet_registerhandler(Messenger *m, int32_t friendnumber, uint8_t byte,
int (*packet_handler_callback)(void *object, uint8_t *data, uint32_t len), void *object)
{
if (friend_not_valid(m, friendnumber))
return -1;
if (byte < PACKET_ID_LOSSLESS_RANGE_START)
return -1;
if (byte >= (PACKET_ID_LOSSLESS_RANGE_START + PACKET_ID_LOSSLESS_RANGE_SIZE))
return -1;
m->friendlist[friendnumber].lossless_packethandlers[byte % PACKET_ID_LOSSLESS_RANGE_SIZE].function =
packet_handler_callback;
m->friendlist[friendnumber].lossless_packethandlers[byte % PACKET_ID_LOSSLESS_RANGE_SIZE].object = object;
return 0;
}
int send_custom_lossless_packet(Messenger *m, int32_t friendnumber, uint8_t *data, uint32_t length)
{
if (friend_not_valid(m, friendnumber))
return -1;
if (m->friendlist[friendnumber].status != FRIEND_ONLINE)
return -1;
if (m->friendlist[friendnumber].crypt_connection_id == -1)
return -1;
return write_cryptpacket(m->net_crypto, m->friendlist[friendnumber].crypt_connection_id, data, length) != -1;
}
/* Function to filter out some friend requests*/ /* Function to filter out some friend requests*/
static int friend_already_added(const uint8_t *client_id, void *data) static int friend_already_added(const uint8_t *client_id, void *data)
@ -2118,6 +2168,8 @@ static int handle_packet(void *object, int i, uint8_t *temp, uint16_t len)
if (m->msi_packet) if (m->msi_packet)
(*m->msi_packet)(m, i, data, data_length, m->msi_packet_userdata); (*m->msi_packet)(m, i, data, data_length, m->msi_packet_userdata);
break;
} }
case PACKET_ID_SHARE_RELAYS: { case PACKET_ID_SHARE_RELAYS: {
@ -2132,9 +2184,11 @@ static int handle_packet(void *object, int i, uint8_t *temp, uint16_t len)
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
add_tcp_relay(m->net_crypto, nodes[i].ip_port, nodes[i].client_id); add_tcp_relay(m->net_crypto, nodes[i].ip_port, nodes[i].client_id);
} }
break;
} }
default: { default: {
handle_custom_lossless_packet(object, i, temp, len);
break; break;
} }
} }

View File

@ -63,6 +63,10 @@
/* Max number of tcp relays sent to friends */ /* Max number of tcp relays sent to friends */
#define MAX_SHARED_RELAYS 16 #define MAX_SHARED_RELAYS 16
/* All packets starting with a byte in this range can be used for anything. */
#define PACKET_ID_LOSSLESS_RANGE_START 160
#define PACKET_ID_LOSSLESS_RANGE_SIZE 32
/* Status definitions. */ /* Status definitions. */
enum { enum {
NOFRIEND, NOFRIEND,
@ -170,7 +174,12 @@ typedef struct {
struct { struct {
int (*function)(void *object, uint8_t *data, uint32_t len); int (*function)(void *object, uint8_t *data, uint32_t len);
void *object; void *object;
} packethandlers[PACKET_ID_LOSSY_RANGE_SIZE]; } lossy_packethandlers[PACKET_ID_LOSSY_RANGE_SIZE];
struct {
int (*function)(void *object, uint8_t *data, uint32_t len);
void *object;
} lossless_packethandlers[PACKET_ID_LOSSLESS_RANGE_SIZE];
} Friend; } Friend;
@ -704,6 +713,24 @@ int custom_lossy_packet_registerhandler(Messenger *m, int32_t friendnumber, uint
*/ */
int send_custom_lossy_packet(Messenger *m, int32_t friendnumber, uint8_t *data, uint32_t length); int send_custom_lossy_packet(Messenger *m, int32_t friendnumber, uint8_t *data, uint32_t length);
/* Set handlers for custom lossless packets.
*
* byte must be in PACKET_ID_LOSSLESS_RANGE_START PACKET_ID_LOSSLESS_RANGE_SIZE range.
*
* return -1 on failure.
* return 0 on success.
*/
int custom_lossless_packet_registerhandler(Messenger *m, int32_t friendnumber, uint8_t byte,
int (*packet_handler_callback)(void *object, uint8_t *data, uint32_t len), void *object);
/* High level function to send custom lossless packets.
*
* return -1 on failure.
* return 0 on success.
*/
int send_custom_lossless_packet(Messenger *m, int32_t friendnumber, uint8_t *data, uint32_t length);
/**********************************************/ /**********************************************/
/* Run this at startup. /* Run this at startup.
* return allocated instance of Messenger on success. * return allocated instance of Messenger on success.