refactor: extract each case in handle packet in messenger

This commit is contained in:
Green Sky 2022-09-17 21:01:17 +02:00
parent 306693aba3
commit d3819b23b3
No known key found for this signature in database
2 changed files with 337 additions and 293 deletions

View File

@ -1 +1 @@
d59fb1fec8d9a8ed4eabd956cfe43bfca70e444420b61ab575b8cb194c409d6e /usr/local/bin/tox-bootstrapd
d2f8e02aeb249b0a22d4a7dee087d5f1301385587cb528e9ae055a6ceb2c4567 /usr/local/bin/tox-bootstrapd

View File

@ -1837,7 +1837,7 @@ int m_send_custom_lossy_packet(const Messenger *m, int32_t friendnumber, const u
}
non_null(1, 3) nullable(5)
static int handle_custom_lossless_packet(void *object, int friend_num, const uint8_t *packet, uint16_t length,
static int m_handle_custom_lossless_packet(void *object, int friend_num, const uint8_t *packet, uint16_t length,
void *userdata)
{
Messenger *m = (Messenger *)object;
@ -1854,7 +1854,7 @@ static int handle_custom_lossless_packet(void *object, int friend_num, const uin
m->lossless_packethandler(m, friend_num, packet[0], packet, length, userdata);
}
return 1;
return 0;
}
void custom_lossless_packet_registerhandler(Messenger *m, m_friend_lossless_packet_cb *lossless_packethandler)
@ -1922,6 +1922,7 @@ static void check_friend_request_timed_out(Messenger *m, uint32_t i, uint64_t t,
}
}
non_null(1) nullable(4)
static int m_handle_status(void *object, int i, bool status, void *userdata)
{
Messenger *m = (Messenger *)object;
@ -1937,39 +1938,21 @@ static int m_handle_status(void *object, int i, bool status, void *userdata)
return 0;
}
static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t len, void *userdata)
non_null(1, 3) nullable(5)
static int m_handle_packet_offline(Messenger *m, const int i, const uint8_t *data, const uint16_t data_length, void *userdata)
{
if (len == 0) {
return -1;
}
Messenger *m = (Messenger *)object;
const uint8_t packet_id = temp[0];
const uint8_t *data = temp + 1;
const uint16_t data_length = len - 1;
if (m->friendlist[i].status != FRIEND_ONLINE) {
if (packet_id == PACKET_ID_ONLINE && len == 1) {
set_friend_status(m, i, FRIEND_ONLINE, userdata);
send_online_packet(m, i);
} else {
return -1;
}
}
switch (packet_id) {
case PACKET_ID_OFFLINE: {
if (data_length > 0) {
break;
}
if (data_length == 0) {
set_friend_status(m, i, FRIEND_CONFIRMED, userdata);
break;
}
case PACKET_ID_NICKNAME: {
return 0;
}
non_null(1, 3) nullable(5)
static int m_handle_packet_nickname(Messenger *m, const int i, const uint8_t *data, const uint16_t data_length, void *userdata)
{
if (data_length > MAX_NAME_LENGTH) {
break;
return 0;
}
/* Make sure the NULL terminator is present. */
@ -1985,12 +1968,14 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
memcpy(m->friendlist[i].name, data_terminated, data_length);
m->friendlist[i].name_length = data_length;
break;
return 0;
}
case PACKET_ID_STATUSMESSAGE: {
non_null(1, 3) nullable(5)
static int m_handle_packet_statusmessage(Messenger *m, const int i, const uint8_t *data, const uint16_t data_length, void *userdata)
{
if (data_length > MAX_STATUSMESSAGE_LENGTH) {
break;
return 0;
}
/* Make sure the NULL terminator is present. */
@ -2003,18 +1988,21 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
}
set_friend_statusmessage(m, i, data_terminated, data_length);
break;
return 0;
}
case PACKET_ID_USERSTATUS: {
non_null(1, 3) nullable(5)
static int m_handle_packet_userstatus(Messenger *m, const int i, const uint8_t *data, const uint16_t data_length, void *userdata)
{
if (data_length != 1) {
break;
return 0;
}
const Userstatus status = (Userstatus)data[0];
if (status >= USERSTATUS_INVALID) {
break;
return 0;
}
if (m->friend_userstatuschange != nullptr) {
@ -2022,12 +2010,15 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
}
set_friend_userstatus(m, i, status);
break;
return 0;
}
case PACKET_ID_TYPING: {
non_null(1, 3) nullable(5)
static int m_handle_packet_typing(Messenger *m, const int i, const uint8_t *data, const uint16_t data_length, void *userdata)
{
if (data_length != 1) {
break;
return 0;
}
const bool typing = data[0] != 0;
@ -2038,13 +2029,14 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
m->friend_typingchange(m, i, typing, userdata);
}
break;
return 0;
}
case PACKET_ID_MESSAGE: // fall-through
case PACKET_ID_ACTION: {
non_null(1, 3) nullable(6)
static int m_handle_packet_message(Messenger *m, const int i, const uint8_t *data, const uint16_t data_length, const Message_Type message_type, void *userdata)
{
if (data_length == 0) {
break;
return 0;
}
const uint8_t *message = data;
@ -2054,32 +2046,35 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
VLA(uint8_t, message_terminated, message_length + 1);
memcpy(message_terminated, message, message_length);
message_terminated[message_length] = 0;
const uint8_t type = packet_id - PACKET_ID_MESSAGE;
if (m->friend_message != nullptr) {
m->friend_message(m, i, type, message_terminated, message_length, userdata);
m->friend_message(m, i, message_type, message_terminated, message_length, userdata);
}
break;
return 0;
}
case PACKET_ID_INVITE_CONFERENCE: {
non_null(1, 3) nullable(5)
static int m_handle_packet_invite_conference(Messenger *m, const int i, const uint8_t *data, const uint16_t data_length, void *userdata)
{
if (data_length == 0) {
break;
return 0;
}
if (m->conference_invite != nullptr) {
m->conference_invite(m, i, data, data_length, userdata);
}
break;
return 0;
}
case PACKET_ID_FILE_SENDREQUEST: {
non_null(1, 3) nullable(5)
static int m_handle_packet_file_sendrequest(Messenger *m, const int i, const uint8_t *data, const uint16_t data_length, void *userdata)
{
const unsigned int head_length = 1 + sizeof(uint32_t) + sizeof(uint64_t) + FILE_ID_LENGTH;
if (data_length < head_length) {
break;
return 0;
}
const uint8_t filenumber = data[0];
@ -2087,7 +2082,7 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
#if UINT8_MAX >= MAX_CONCURRENT_FILE_PIPES
if (filenumber >= MAX_CONCURRENT_FILE_PIPES) {
break;
return 0;
}
#endif
@ -2097,7 +2092,7 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
const uint16_t filename_length = data_length - head_length;
if (filename_length > MAX_FILENAME_LENGTH) {
break;
return 0;
}
memcpy(&file_type, data + 1, sizeof(file_type));
@ -2107,7 +2102,7 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
struct File_Transfers *ft = &m->friendlist[i].file_receiving[filenumber];
if (ft->status != FILESTATUS_NONE) {
break;
return 0;
}
ft->status = FILESTATUS_NOT_ACCEPTED;
@ -2135,25 +2130,27 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
userdata);
}
break;
return 0;
}
case PACKET_ID_FILE_CONTROL: {
non_null(1, 3) nullable(5)
static int m_handle_packet_file_control(Messenger *m, const int i, const uint8_t *data, const uint16_t data_length, void *userdata)
{
if (data_length < 3) {
break;
return 0;
}
// On the other side, "outbound" is "inbound", i.e. if they send 1,
// that means "inbound" on their side, but we call it "outbound"
// here.
const bool outbound = data[0] == 1;
uint8_t filenumber = data[1];
const uint8_t filenumber = data[1];
const uint8_t control_type = data[2];
#if UINT8_MAX >= MAX_CONCURRENT_FILE_PIPES
if (filenumber >= MAX_CONCURRENT_FILE_PIPES) {
break;
return 0;
}
#endif
@ -2161,23 +2158,25 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
if (handle_filecontrol(m, i, outbound, filenumber, control_type, data + 3, data_length - 3, userdata) == -1) {
// TODO(iphydf): Do something different here? Right now, this
// check is pointless.
break;
return 0;
}
break;
return 0;
}
case PACKET_ID_FILE_DATA: {
non_null(1, 3) nullable(5)
static int m_handle_packet_file_data(Messenger *m, const int i, const uint8_t *data, const uint16_t data_length, void *userdata)
{
if (data_length < 1) {
break;
return 0;
}
uint8_t filenumber = data[0];
const uint8_t filenumber = data[0];
#if UINT8_MAX >= MAX_CONCURRENT_FILE_PIPES
if (filenumber >= MAX_CONCURRENT_FILE_PIPES) {
break;
return 0;
}
#endif
@ -2185,7 +2184,7 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
struct File_Transfers *ft = &m->friendlist[i].file_receiving[filenumber];
if (ft->status != FILESTATUS_TRANSFERRING) {
break;
return 0;
}
uint64_t position = ft->transferred;
@ -2228,30 +2227,75 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le
ft->status = FILESTATUS_NONE;
}
break;
return 0;
}
case PACKET_ID_MSI: {
non_null(1, 3) nullable(5)
static int m_handle_packet_msi(Messenger *m, const int i, const uint8_t *data, const uint16_t data_length, void *userdata)
{
if (data_length == 0) {
break;
return 0;
}
if (m->msi_packet != nullptr) {
m->msi_packet(m, i, data, data_length, m->msi_packet_userdata);
}
break;
}
default: {
handle_custom_lossless_packet(object, i, temp, len, userdata);
break;
}
}
return 0;
}
non_null(1, 3) nullable(5)
static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t len, void *userdata)
{
if (len == 0) {
return -1;
}
Messenger *m = (Messenger *)object;
const uint8_t packet_id = temp[0];
const uint8_t *data = temp + 1;
const uint16_t data_length = len - 1;
if (m->friendlist[i].status != FRIEND_ONLINE) {
if (packet_id == PACKET_ID_ONLINE && len == 1) {
set_friend_status(m, i, FRIEND_ONLINE, userdata);
send_online_packet(m, i);
} else {
return -1;
}
}
switch (packet_id) {
// TODO(Green-Sky): now all return 0 on error AND success, make errors errors?
case PACKET_ID_OFFLINE:
return m_handle_packet_offline(m, i, data, data_length, userdata);
case PACKET_ID_NICKNAME:
return m_handle_packet_nickname(m, i, data, data_length, userdata);
case PACKET_ID_STATUSMESSAGE:
return m_handle_packet_statusmessage(m, i, data, data_length, userdata);
case PACKET_ID_USERSTATUS:
return m_handle_packet_userstatus(m, i, data, data_length, userdata);
case PACKET_ID_TYPING:
return m_handle_packet_typing(m, i, data, data_length, userdata);
case PACKET_ID_MESSAGE:
return m_handle_packet_message(m, i, data, data_length, MESSAGE_NORMAL, userdata);
case PACKET_ID_ACTION:
return m_handle_packet_message(m, i, data, data_length, MESSAGE_ACTION, userdata);
case PACKET_ID_INVITE_CONFERENCE:
return m_handle_packet_invite_conference(m, i, data, data_length, userdata);
case PACKET_ID_FILE_SENDREQUEST:
return m_handle_packet_file_sendrequest(m, i, data, data_length, userdata);
case PACKET_ID_FILE_CONTROL:
return m_handle_packet_file_control(m, i, data, data_length, userdata);
case PACKET_ID_FILE_DATA:
return m_handle_packet_file_data(m, i, data, data_length, userdata);
case PACKET_ID_MSI:
return m_handle_packet_msi(m, i, data, data_length, userdata);
}
return m_handle_custom_lossless_packet(object, i, temp, len, userdata);
}
non_null(1) nullable(2)
static void do_friends(Messenger *m, void *userdata)
{