static void del_dead_peers(Group_Chat *chat) { uint32_t i; for (i = 0; i < chat->numpeers; ++i) { if (is_timeout(chat->group[i].last_recv_msgping, GROUP_PING_INTERVAL * 4)) { delpeer(chat, i); } if (chat->group == NULL || i >= chat->numpeers) break; if (chat->group[i].deleted) { if (is_timeout(chat->group[i].deleted_time, DEL_PEER_DELAY)) delpeer(chat, i); } } }
static void del_dead_peers(Group_Chat *chat) { uint32_t i; for (i = 0; i < chat->numpeers; ++i) { if (is_timeout(chat->group[i].last_recv_msgping, GROUP_PING_INTERVAL * 2)) { delpeer(chat, chat->group[i].client_id); } } }
static int groupchat_clear_timedout(Group_Chats *g_c, int groupnumber) { Group_c *g = get_group_c(g_c, groupnumber); if (!g) return -1; uint32_t i; for (i = 0; i < g->numpeers; ++i) { if (g->peer_number != g->group[i].peer_number && is_timeout(g->group[i].last_recv, GROUP_PING_INTERVAL * 2)) { delpeer(g_c, groupnumber, i); } if (g->group == NULL || i >= g->numpeers) break; } return 0; }
static void handle_message_packet_group(Group_Chats *g_c, int groupnumber, const uint8_t *data, uint16_t length, int close_index) { if (length < sizeof(uint16_t) + sizeof(uint32_t) + 1) return; Group_c *g = get_group_c(g_c, groupnumber); if (!g) return; uint16_t peer_number; memcpy(&peer_number, data, sizeof(uint16_t)); peer_number = ntohs(peer_number); int index = get_peer_index(g, peer_number); if (index == -1) return; uint32_t message_number; memcpy(&message_number, data + sizeof(uint16_t), sizeof(message_number)); message_number = ntohl(message_number); if (g->group[index].last_message_number == 0) { g->group[index].last_message_number = message_number; } else if (message_number - g->group[index].last_message_number > 64 || message_number == g->group[index].last_message_number) { return; } g->group[index].last_message_number = message_number; uint8_t message_id = data[sizeof(uint16_t) + sizeof(message_number)]; const uint8_t *msg_data = data + sizeof(uint16_t) + sizeof(message_number) + 1; uint16_t msg_data_len = length - (sizeof(uint16_t) + sizeof(message_number) + 1); switch (message_id) { case GROUP_MESSAGE_PING_ID: { if (msg_data_len != 0) return; g->group[index].last_recv = unix_time(); } break; case GROUP_MESSAGE_NEW_PEER_ID: { if (msg_data_len != GROUP_MESSAGE_NEW_PEER_LENGTH) return; uint16_t new_peer_number; memcpy(&new_peer_number, msg_data, sizeof(uint16_t)); new_peer_number = ntohs(new_peer_number); addpeer(g_c, groupnumber, msg_data + sizeof(uint16_t), msg_data + sizeof(uint16_t) + crypto_box_PUBLICKEYBYTES, new_peer_number); } break; case GROUP_MESSAGE_KILL_PEER_ID: { if (msg_data_len != GROUP_MESSAGE_KILL_PEER_LENGTH) return; uint16_t kill_peer_number; memcpy(&kill_peer_number, msg_data, sizeof(uint16_t)); kill_peer_number = ntohs(kill_peer_number); if (peer_number == kill_peer_number) { delpeer(g_c, groupnumber, index); } else { //TODO } } break; case GROUP_MESSAGE_NAME_ID: { if (setnick(g_c, groupnumber, index, msg_data, msg_data_len) == -1) return; } break; case PACKET_ID_MESSAGE: { if (msg_data_len == 0) return; uint8_t newmsg[msg_data_len + 1]; memcpy(newmsg, msg_data, msg_data_len); newmsg[msg_data_len] = 0; //TODO if (g_c->message_callback) g_c->message_callback(g_c->m, groupnumber, index, newmsg, msg_data_len, g_c->message_callback_userdata); break; } default: return; } send_message_all_close(g_c, groupnumber, data, length, -1/*TODO close_index*/); }