diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d5c10cf..ab9ba1b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -96,7 +96,7 @@ jobs: - name: Configure CMake run: cmake --preset windows-default - name: Build - run: cmake --build _build + run: cmake --build _build -j $([int]$env:NUMBER_OF_PROCESSORS+2) - name: Test run: | cd _build diff --git a/.gitignore b/.gitignore index 2e4a095..33b7971 100644 --- a/.gitignore +++ b/.gitignore @@ -70,7 +70,7 @@ build/ *.nvim* *.vim* -#kdevelop +# kdevelop .kdev/ *.kdev* @@ -93,5 +93,9 @@ cscope.files # rpm tox.spec +# clangd +.cache/ +compile_commands.json + /infer .idea/ diff --git a/CMakeLists.txt b/CMakeLists.txt index aaf6b37..5eefb82 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -338,6 +338,8 @@ set(toxcore_SOURCES toxcore/tox.h toxcore/tox_private.c toxcore/tox_private.h + toxcore/tox_pack.c + toxcore/tox_pack.h toxcore/tox_unpack.c toxcore/tox_unpack.h toxcore/util.c diff --git a/auto_tests/CMakeLists.txt b/auto_tests/CMakeLists.txt index 1bc962d..d891ba1 100644 --- a/auto_tests/CMakeLists.txt +++ b/auto_tests/CMakeLists.txt @@ -46,8 +46,9 @@ auto_test(crypto) #auto_test(dht) # Doesn't work with UNITY_BUILD. auto_test(dht_getnodes_api) auto_test(encryptsave) -auto_test(file_transfer) auto_test(file_saving) +auto_test(file_streaming) +auto_test(file_transfer) auto_test(forwarding) auto_test(friend_connection) auto_test(friend_request) diff --git a/auto_tests/Makefile.inc b/auto_tests/Makefile.inc index d55f714..1553445 100644 --- a/auto_tests/Makefile.inc +++ b/auto_tests/Makefile.inc @@ -15,6 +15,7 @@ TESTS = \ crypto_test \ encryptsave_test \ file_saving_test \ + file_streaming_test \ file_transfer_test \ forwarding_test \ friend_connection_test \ @@ -103,6 +104,10 @@ file_saving_test_SOURCES = ../auto_tests/file_saving_test.c file_saving_test_CFLAGS = $(AUTOTEST_CFLAGS) file_saving_test_LDADD = $(AUTOTEST_LDADD) +file_streaming_test_SOURCES = ../auto_tests/file_streaming_test.c +file_streaming_test_CFLAGS = $(AUTOTEST_CFLAGS) +file_streaming_test_LDADD = $(AUTOTEST_LDADD) + file_transfer_test_SOURCES = ../auto_tests/file_transfer_test.c file_transfer_test_CFLAGS = $(AUTOTEST_CFLAGS) file_transfer_test_LDADD = $(AUTOTEST_LDADD) diff --git a/auto_tests/auto_test_support.c b/auto_tests/auto_test_support.c index 3a56039..21346e5 100644 --- a/auto_tests/auto_test_support.c +++ b/auto_tests/auto_test_support.c @@ -13,6 +13,10 @@ #define ABORT_ON_LOG_ERROR true #endif +#ifndef USE_IPV6 +#define USE_IPV6 1 +#endif + Run_Auto_Options default_run_auto_options(void) { return (Run_Auto_Options) { @@ -193,6 +197,7 @@ void reload(AutoTox *autotox) struct Tox_Options *const options = tox_options_new(nullptr); ck_assert(options != nullptr); + tox_options_set_ipv6_enabled(options, USE_IPV6); tox_options_set_savedata_type(options, TOX_SAVEDATA_TYPE_TOX_SAVE); tox_options_set_savedata_data(options, autotox->save_state, autotox->save_size); autotox->tox = tox_new_log(options, nullptr, &autotox->index); @@ -214,6 +219,8 @@ static void initialise_autotox(struct Tox_Options *options, AutoTox *autotox, ui struct Tox_Options *default_opts = tox_options_new(nullptr); ck_assert(default_opts != nullptr); + tox_options_set_ipv6_enabled(default_opts, USE_IPV6); + if (options == nullptr) { options = default_opts; } @@ -426,6 +433,7 @@ Tox *tox_new_log_lan(struct Tox_Options *options, Tox_Err_New *err, void *log_us assert(log_options != nullptr); + tox_options_set_ipv6_enabled(log_options, USE_IPV6); tox_options_set_local_discovery_enabled(log_options, lan_discovery); // Use a higher start port for non-LAN-discovery tests so it's more likely for the LAN discovery // test to get the default port 33445. diff --git a/auto_tests/file_streaming_test.c b/auto_tests/file_streaming_test.c new file mode 100644 index 0000000..fdb3d2c --- /dev/null +++ b/auto_tests/file_streaming_test.c @@ -0,0 +1,275 @@ +/* File transfer test: streaming version (no known size). + */ + +#include +#include +#include +#include + +#include "../testing/misc_tools.h" +#include "../toxcore/ccompat.h" +#include "../toxcore/tox.h" +#include "../toxcore/util.h" +#include "auto_test_support.h" +#include "check_compat.h" + +#ifndef USE_IPV6 +#define USE_IPV6 1 +#endif + +#ifdef TOX_LOCALHOST +#undef TOX_LOCALHOST +#endif +#if USE_IPV6 +#define TOX_LOCALHOST "::1" +#else +#define TOX_LOCALHOST "127.0.0.1" +#endif + +static void accept_friend_request(Tox *m, const uint8_t *public_key, const uint8_t *data, size_t length, void *userdata) +{ + if (length == 7 && memcmp("Gentoo", data, 7) == 0) { + tox_friend_add_norequest(m, public_key, nullptr); + } +} + +static uint64_t size_recv; +static uint64_t sending_pos; + +static uint8_t file_cmp_id[TOX_FILE_ID_LENGTH]; +static uint32_t file_accepted; +static uint64_t file_size; +static void tox_file_receive(Tox *tox, uint32_t friend_number, uint32_t file_number, uint32_t kind, uint64_t filesize, + const uint8_t *filename, size_t filename_length, void *userdata) +{ + ck_assert_msg(kind == TOX_FILE_KIND_DATA, "bad kind"); + + ck_assert_msg(filename_length == sizeof("Gentoo.exe") + && memcmp(filename, "Gentoo.exe", sizeof("Gentoo.exe")) == 0, "bad filename"); + + uint8_t file_id[TOX_FILE_ID_LENGTH]; + + ck_assert_msg(tox_file_get_file_id(tox, friend_number, file_number, file_id, nullptr), "tox_file_get_file_id error"); + + ck_assert_msg(memcmp(file_id, file_cmp_id, TOX_FILE_ID_LENGTH) == 0, "bad file_id"); + + uint8_t empty[TOX_FILE_ID_LENGTH] = {0}; + + ck_assert_msg(memcmp(empty, file_cmp_id, TOX_FILE_ID_LENGTH) != 0, "empty file_id"); + + file_size = filesize; + + if (filesize) { + sending_pos = size_recv = 1337; + + Tox_Err_File_Seek err_s; + + ck_assert_msg(tox_file_seek(tox, friend_number, file_number, 1337, &err_s), "tox_file_seek error"); + + ck_assert_msg(err_s == TOX_ERR_FILE_SEEK_OK, "tox_file_seek wrong error"); + + } else { + sending_pos = size_recv = 0; + } + + Tox_Err_File_Control error; + + ck_assert_msg(tox_file_control(tox, friend_number, file_number, TOX_FILE_CONTROL_RESUME, &error), + "tox_file_control failed. %i", error); + ++file_accepted; + + Tox_Err_File_Seek err_s; + + ck_assert_msg(!tox_file_seek(tox, friend_number, file_number, 1234, &err_s), "tox_file_seek no error"); + + ck_assert_msg(err_s == TOX_ERR_FILE_SEEK_DENIED, "tox_file_seek wrong error"); +} + +static uint32_t sendf_ok; +static void file_print_control(Tox *tox, uint32_t friend_number, uint32_t file_number, Tox_File_Control control, + void *userdata) +{ + /* First send file num is 0.*/ + if (file_number == 0 && control == TOX_FILE_CONTROL_RESUME) { + sendf_ok = 1; + } +} + +static uint64_t max_sending; +static bool m_send_reached; +static uint8_t sending_num; +static bool file_sending_done; +static void tox_file_chunk_request(Tox *tox, uint32_t friend_number, uint32_t file_number, uint64_t position, + size_t length, void *user_data) +{ + ck_assert_msg(sendf_ok, "didn't get resume control"); + + ck_assert_msg(sending_pos == position, "bad position %lu", (unsigned long)position); + + if (length == 0) { + ck_assert_msg(!file_sending_done, "file sending already done"); + + file_sending_done = 1; + return; + } + + if (position + length > max_sending) { + ck_assert_msg(!m_send_reached, "requested done file transfer"); + + length = max_sending - position; + m_send_reached = 1; + } + + VLA(uint8_t, f_data, length); + memset(f_data, sending_num, length); + + Tox_Err_File_Send_Chunk error; + tox_file_send_chunk(tox, friend_number, file_number, position, f_data, length, &error); + + + ck_assert_msg(error == TOX_ERR_FILE_SEND_CHUNK_OK, + "could not send chunk, error num=%d pos=%d len=%d", (int)error, (int)position, (int)length); + + ++sending_num; + sending_pos += length; +} + + +static uint8_t num; +static bool file_recv; +static void write_file(Tox *tox, uint32_t friendnumber, uint32_t filenumber, uint64_t position, const uint8_t *data, + size_t length, void *user_data) +{ + ck_assert_msg(size_recv == position, "bad position"); + + if (length == 0) { + file_recv = 1; + return; + } + + VLA(uint8_t, f_data, length); + memset(f_data, num, length); + ++num; + + ck_assert_msg(memcmp(f_data, data, length) == 0, "FILE_CORRUPTED"); + + size_recv += length; +} + +static void file_transfer_test(void) +{ + printf("Starting test: few_clients\n"); + uint32_t index[] = { 1, 2, 3 }; + long long unsigned int cur_time = time(nullptr); + Tox_Err_New t_n_error; + Tox *tox1 = tox_new_log(nullptr, &t_n_error, &index[0]); + ck_assert_msg(t_n_error == TOX_ERR_NEW_OK, "wrong error"); + Tox *tox2 = tox_new_log(nullptr, &t_n_error, &index[1]); + ck_assert_msg(t_n_error == TOX_ERR_NEW_OK, "wrong error"); + Tox *tox3 = tox_new_log(nullptr, &t_n_error, &index[2]); + ck_assert_msg(t_n_error == TOX_ERR_NEW_OK, "wrong error"); + + ck_assert_msg(tox1 && tox2 && tox3, "Failed to create 3 tox instances"); + + tox_callback_friend_request(tox2, accept_friend_request); + uint8_t address[TOX_ADDRESS_SIZE]; + tox_self_get_address(tox2, address); + uint32_t test = tox_friend_add(tox3, address, (const uint8_t *)"Gentoo", 7, nullptr); + ck_assert_msg(test == 0, "Failed to add friend error code: %u", test); + + uint8_t dht_key[TOX_PUBLIC_KEY_SIZE]; + tox_self_get_dht_id(tox1, dht_key); + uint16_t dht_port = tox_self_get_udp_port(tox1, nullptr); + + tox_bootstrap(tox2, TOX_LOCALHOST, dht_port, dht_key, nullptr); + tox_bootstrap(tox3, TOX_LOCALHOST, dht_port, dht_key, nullptr); + + printf("Waiting for toxes to come online\n"); + + do { + tox_iterate(tox1, nullptr); + tox_iterate(tox2, nullptr); + tox_iterate(tox3, nullptr); + + printf("Connections: self (%d, %d, %d), friends (%d, %d)\n", + tox_self_get_connection_status(tox1), + tox_self_get_connection_status(tox2), + tox_self_get_connection_status(tox3), + tox_friend_get_connection_status(tox2, 0, nullptr), + tox_friend_get_connection_status(tox3, 0, nullptr)); + c_sleep(ITERATION_INTERVAL); + } while (tox_self_get_connection_status(tox1) == TOX_CONNECTION_NONE || + tox_self_get_connection_status(tox2) == TOX_CONNECTION_NONE || + tox_self_get_connection_status(tox3) == TOX_CONNECTION_NONE || + tox_friend_get_connection_status(tox2, 0, nullptr) == TOX_CONNECTION_NONE || + tox_friend_get_connection_status(tox3, 0, nullptr) == TOX_CONNECTION_NONE); + + printf("Starting file transfer test: 100MiB file.\n"); + + file_accepted = file_size = sendf_ok = size_recv = 0; + file_recv = 0; + max_sending = UINT64_MAX; + uint64_t totalf_size = 100 * 1024 * 1024; + + printf("Starting file streaming transfer test.\n"); + + file_sending_done = 0; + file_accepted = 0; + file_size = 0; + sendf_ok = 0; + size_recv = 0; + file_recv = 0; + tox_callback_file_recv_chunk(tox3, write_file); + tox_callback_file_recv_control(tox2, file_print_control); + tox_callback_file_chunk_request(tox2, tox_file_chunk_request); + tox_callback_file_recv_control(tox3, file_print_control); + tox_callback_file_recv(tox3, tox_file_receive); + totalf_size = UINT64_MAX; + Tox_File_Number fnum = tox_file_send( + tox2, 0, TOX_FILE_KIND_DATA, totalf_size, nullptr, + (const uint8_t *)"Gentoo.exe", sizeof("Gentoo.exe"), nullptr); + ck_assert_msg(fnum != UINT32_MAX, "tox_new_file_sender fail"); + + Tox_Err_File_Get gfierr; + ck_assert_msg(!tox_file_get_file_id(tox2, 1, fnum, file_cmp_id, &gfierr), "tox_file_get_file_id didn't fail"); + ck_assert_msg(gfierr == TOX_ERR_FILE_GET_FRIEND_NOT_FOUND, "wrong error"); + ck_assert_msg(!tox_file_get_file_id(tox2, 0, fnum + 1, file_cmp_id, &gfierr), "tox_file_get_file_id didn't fail"); + ck_assert_msg(gfierr == TOX_ERR_FILE_GET_NOT_FOUND, "wrong error"); + ck_assert_msg(tox_file_get_file_id(tox2, 0, fnum, file_cmp_id, &gfierr), "tox_file_get_file_id failed"); + ck_assert_msg(gfierr == TOX_ERR_FILE_GET_OK, "wrong error"); + + max_sending = 100 * 1024; + m_send_reached = 0; + + do { + tox_iterate(tox1, nullptr); + tox_iterate(tox2, nullptr); + tox_iterate(tox3, nullptr); + + uint32_t tox1_interval = tox_iteration_interval(tox1); + uint32_t tox2_interval = tox_iteration_interval(tox2); + uint32_t tox3_interval = tox_iteration_interval(tox3); + + c_sleep(min_u32(tox1_interval, min_u32(tox2_interval, tox3_interval))); + } while (!file_sending_done); + + ck_assert_msg(sendf_ok && file_recv && m_send_reached && totalf_size == file_size && size_recv == max_sending + && sending_pos == size_recv && file_accepted == 1, + "something went wrong in file transfer %u %u %u %u %u %u %u %lu %lu %lu %lu", sendf_ok, file_recv, + m_send_reached, totalf_size == file_size, size_recv == max_sending, sending_pos == size_recv, file_accepted == 1, + (unsigned long)totalf_size, (unsigned long)file_size, + (unsigned long)size_recv, (unsigned long)sending_pos); + + printf("file_transfer_test succeeded, took %llu seconds\n", time(nullptr) - cur_time); + + tox_kill(tox1); + tox_kill(tox2); + tox_kill(tox3); +} + +int main(void) +{ + setvbuf(stdout, nullptr, _IONBF, 0); + file_transfer_test(); + return 0; +} diff --git a/auto_tests/file_transfer_test.c b/auto_tests/file_transfer_test.c index b65fa01..522717f 100644 --- a/auto_tests/file_transfer_test.c +++ b/auto_tests/file_transfer_test.c @@ -13,9 +13,14 @@ #include "auto_test_support.h" #include "check_compat.h" -/* The Travis-CI container responds poorly to ::1 as a localhost address - * You're encouraged to -D FORCE_TESTS_IPV6 on a local test */ -#ifdef FORCE_TESTS_IPV6 +#ifndef USE_IPV6 +#define USE_IPV6 1 +#endif + +#ifdef TOX_LOCALHOST +#undef TOX_LOCALHOST +#endif +#if USE_IPV6 #define TOX_LOCALHOST "::1" #else #define TOX_LOCALHOST "127.0.0.1" @@ -261,53 +266,6 @@ static void file_transfer_test(void) printf("100MiB file sent in %lu seconds\n", (unsigned long)(time(nullptr) - f_time)); - printf("Starting file streaming transfer test.\n"); - - file_sending_done = 0; - file_accepted = 0; - file_size = 0; - sendf_ok = 0; - size_recv = 0; - file_recv = 0; - tox_callback_file_recv_chunk(tox3, write_file); - tox_callback_file_recv_control(tox2, file_print_control); - tox_callback_file_chunk_request(tox2, tox_file_chunk_request); - tox_callback_file_recv_control(tox3, file_print_control); - tox_callback_file_recv(tox3, tox_file_receive); - totalf_size = UINT64_MAX; - fnum = tox_file_send(tox2, 0, TOX_FILE_KIND_DATA, totalf_size, nullptr, - (const uint8_t *)"Gentoo.exe", sizeof("Gentoo.exe"), nullptr); - ck_assert_msg(fnum != UINT32_MAX, "tox_new_file_sender fail"); - - ck_assert_msg(!tox_file_get_file_id(tox2, 1, fnum, file_cmp_id, &gfierr), "tox_file_get_file_id didn't fail"); - ck_assert_msg(gfierr == TOX_ERR_FILE_GET_FRIEND_NOT_FOUND, "wrong error"); - ck_assert_msg(!tox_file_get_file_id(tox2, 0, fnum + 1, file_cmp_id, &gfierr), "tox_file_get_file_id didn't fail"); - ck_assert_msg(gfierr == TOX_ERR_FILE_GET_NOT_FOUND, "wrong error"); - ck_assert_msg(tox_file_get_file_id(tox2, 0, fnum, file_cmp_id, &gfierr), "tox_file_get_file_id failed"); - ck_assert_msg(gfierr == TOX_ERR_FILE_GET_OK, "wrong error"); - - max_sending = 100 * 1024; - m_send_reached = 0; - - do { - tox_iterate(tox1, nullptr); - tox_iterate(tox2, nullptr); - tox_iterate(tox3, nullptr); - - uint32_t tox1_interval = tox_iteration_interval(tox1); - uint32_t tox2_interval = tox_iteration_interval(tox2); - uint32_t tox3_interval = tox_iteration_interval(tox3); - - c_sleep(min_u32(tox1_interval, min_u32(tox2_interval, tox3_interval))); - } while (!file_sending_done); - - ck_assert_msg(sendf_ok && file_recv && m_send_reached && totalf_size == file_size && size_recv == max_sending - && sending_pos == size_recv && file_accepted == 1, - "something went wrong in file transfer %u %u %u %u %u %u %u %lu %lu %lu %lu", sendf_ok, file_recv, - m_send_reached, totalf_size == file_size, size_recv == max_sending, sending_pos == size_recv, file_accepted == 1, - (unsigned long)totalf_size, (unsigned long)file_size, - (unsigned long)size_recv, (unsigned long)sending_pos); - printf("starting file 0 transfer test.\n"); file_sending_done = 0; diff --git a/auto_tests/group_moderation_test.c b/auto_tests/group_moderation_test.c index cd12f21..6f10ef7 100644 --- a/auto_tests/group_moderation_test.c +++ b/auto_tests/group_moderation_test.c @@ -247,7 +247,7 @@ static void handle_user(State *state, const char *peer_name, size_t peer_name_le } static void group_mod_event_handler(Tox *tox, uint32_t group_number, uint32_t source_peer_id, uint32_t target_peer_id, - Tox_Group_Mod_Event event, void *user_data) + Tox_Group_Mod_Event mod_type, void *user_data) { AutoTox *autotox = (AutoTox *)user_data; ck_assert(autotox != nullptr); @@ -275,7 +275,11 @@ static void group_mod_event_handler(Tox *tox, uint32_t group_number, uint32_t so Tox_Group_Role role = tox_group_peer_get_role(tox, group_number, target_peer_id, &q_err); ck_assert(q_err == TOX_ERR_GROUP_PEER_QUERY_OK); - switch (event) { + fprintf(stderr, "tox%u: got moderator event %d (%s), role = %s\n", + autotox->index, mod_type, tox_group_mod_event_to_string(mod_type), + tox_group_role_to_string(role)); + + switch (mod_type) { case TOX_GROUP_MOD_EVENT_MODERATOR: { handle_mod(state, peer_name, peer_name_len, role); break; @@ -298,7 +302,7 @@ static void group_mod_event_handler(Tox *tox, uint32_t group_number, uint32_t so } default: { - ck_assert_msg(0, "Got invalid moderator event %d", event); + ck_assert_msg(0, "Got invalid moderator event %d", mod_type); return; } } diff --git a/auto_tests/save_load_test.c b/auto_tests/save_load_test.c index 9707773..20baed5 100644 --- a/auto_tests/save_load_test.c +++ b/auto_tests/save_load_test.c @@ -14,12 +14,14 @@ #include "auto_test_support.h" #include "check_compat.h" -/* The Travis-CI container responds poorly to ::1 as a localhost address - * You're encouraged to -D FORCE_TESTS_IPV6 on a local test */ +#ifndef USE_IPV6 +#define USE_IPV6 1 +#endif + #ifdef TOX_LOCALHOST #undef TOX_LOCALHOST #endif -#ifdef FORCE_TESTS_IPV6 +#if USE_IPV6 #define TOX_LOCALHOST "::1" #else #define TOX_LOCALHOST "127.0.0.1" @@ -74,6 +76,7 @@ static void reload_tox(Tox **tox, struct Tox_Options *const in_opts, void *user_ } struct Tox_Options *const options = (in_opts == nullptr) ? tox_options_new(nullptr) : in_opts; + tox_options_set_ipv6_enabled(options, USE_IPV6); tox_options_set_savedata_type(options, TOX_SAVEDATA_TYPE_TOX_SAVE); @@ -138,6 +141,7 @@ static void test_few_clients(void) time_t con_time = 0, cur_time = time(nullptr); struct Tox_Options *opts1 = tox_options_new(nullptr); + tox_options_set_ipv6_enabled(opts1, USE_IPV6); tox_options_set_tcp_port(opts1, TCP_RELAY_PORT); Tox_Err_New t_n_error; Tox *tox1 = tox_new_log(opts1, &t_n_error, &index[0]); @@ -145,12 +149,14 @@ static void test_few_clients(void) tox_options_free(opts1); struct Tox_Options *opts2 = tox_options_new(nullptr); + tox_options_set_ipv6_enabled(opts2, USE_IPV6); tox_options_set_udp_enabled(opts2, false); tox_options_set_local_discovery_enabled(opts2, false); Tox *tox2 = tox_new_log(opts2, &t_n_error, &index[1]); ck_assert_msg(t_n_error == TOX_ERR_NEW_OK, "Failed to create tox instance: %d", t_n_error); struct Tox_Options *opts3 = tox_options_new(nullptr); + tox_options_set_ipv6_enabled(opts3, USE_IPV6); tox_options_set_local_discovery_enabled(opts3, false); Tox *tox3 = tox_new_log(opts3, &t_n_error, &index[2]); ck_assert_msg(t_n_error == TOX_ERR_NEW_OK, "Failed to create tox instance: %d", t_n_error); diff --git a/auto_tests/tox_many_tcp_test.c b/auto_tests/tox_many_tcp_test.c index 0fda918..b6e34d7 100644 --- a/auto_tests/tox_many_tcp_test.c +++ b/auto_tests/tox_many_tcp_test.c @@ -13,9 +13,14 @@ #include "auto_test_support.h" #include "check_compat.h" -/* The Travis-CI container responds poorly to ::1 as a localhost address - * You're encouraged to -D FORCE_TESTS_IPV6 on a local test */ -#ifdef FORCE_TESTS_IPV6 +#ifndef USE_IPV6 +#define USE_IPV6 1 +#endif + +#ifdef TOX_LOCALHOST +#undef TOX_LOCALHOST +#endif +#if USE_IPV6 #define TOX_LOCALHOST "::1" #else #define TOX_LOCALHOST "127.0.0.1" diff --git a/other/bootstrap_daemon/docker/tox-bootstrapd.sha256 b/other/bootstrap_daemon/docker/tox-bootstrapd.sha256 index 6cee77a..fc02a5e 100644 --- a/other/bootstrap_daemon/docker/tox-bootstrapd.sha256 +++ b/other/bootstrap_daemon/docker/tox-bootstrapd.sha256 @@ -1 +1 @@ -5061f92a95ba45cfa49d78175fa8fb6e4d66a58d86634ea3fd3ae6d80cb0558a /usr/local/bin/tox-bootstrapd +0b904988d79b9576bb88c6c7316d107b5a61bd6119a0992ebd7c1fa43db70abf /usr/local/bin/tox-bootstrapd diff --git a/other/event_tooling/generate_event_c.cpp b/other/event_tooling/generate_event_c.cpp index b736b6f..92cab07 100644 --- a/other/event_tooling/generate_event_c.cpp +++ b/other/event_tooling/generate_event_c.cpp @@ -56,15 +56,31 @@ std::string bin_pack_name_from_type(const std::string& type) { return "bin_pack_u8"; } else if (type == "bool") { return "bin_pack_bool"; - // only unpack is special TODO(Green-Sky): should we change that? - //} else if (type == "Tox_User_Status") { - //return "tox_pack_user_status"; - //} else if (type == "Tox_Conference_Type") { - //return "tox_pack_conference_type"; + } else if (type == "Tox_User_Status") { + return "tox_user_status_pack"; + } else if (type == "Tox_Conference_Type") { + return "tox_conference_type_pack"; + } else if (type == "Tox_Message_Type") { + return "tox_message_type_pack"; + } else if (type == "Tox_File_Control") { + return "tox_file_control_pack"; + } else if (type == "Tox_Connection") { + return "tox_connection_pack"; + } else if (type == "Tox_Group_Privacy_State") { + return "tox_group_privacy_state_pack"; + } else if (type == "Tox_Group_Voice_State") { + return "tox_group_voice_state_pack"; + } else if (type == "Tox_Group_Topic_Lock") { + return "tox_group_topic_lock_pack"; + } else if (type == "Tox_Group_Join_Fail") { + return "tox_group_join_fail_pack"; + } else if (type == "Tox_Group_Mod_Event") { + return "tox_group_mod_event_pack"; + } else if (type == "Tox_Group_Exit_Type") { + return "tox_group_exit_type_pack"; } else { - //std::cerr << "unknown type " << type << "\n"; - //exit(1); - // assume enum -> u32 + std::cerr << "unknown type " << type << "\n"; + exit(1); return "bin_pack_u32"; } } @@ -164,6 +180,7 @@ void generate_event_impl(const std::string& event_name, const std::vector 1) { - f << "\n && bin_pack_array(bp, " << event_types.size() << ")"; + f << " return bin_pack_array(bp, " << event_types.size() << ")"; + return_started = true; } for (const auto& t : event_types) { - f << "\n && "; + if (return_started) { + f << "\n && "; + } else { + f << " return "; + } + std::visit( overloaded{ [&](const EventTypeTrivial& t) { f << bin_pack_name_from_type(t.type); - f << "(bp, event->" << t.name << ")"; + if (t.type.rfind("Tox_", 0) == 0) { + f << "(event->" << t.name << ", bp)"; + } else { + f << "(bp, event->" << t.name << ")"; + } }, [&](const EventTypeByteRange& t) { f << "bin_pack_bin(bp, event->" << t.name_data << ", event->" << t.name_length << ")"; @@ -354,7 +381,11 @@ void generate_event_impl(const std::string& event_name, const std::vector" << t.name << ")"; + if (t.type.rfind("Tox_", 0) == 0) { + f << "(&event->" << t.name << ", bu)"; + } else { + f << "(bu, &event->" << t.name << ")"; + } }, [&](const EventTypeByteRange& t) { f << "bin_unpack_bin(bu, &event->" << t.name_data << ", &event->" << t.name_length << ")"; diff --git a/toxcore/BUILD.bazel b/toxcore/BUILD.bazel index becd3e8..534ead3 100644 --- a/toxcore/BUILD.bazel +++ b/toxcore/BUILD.bazel @@ -730,17 +730,6 @@ cc_library( ], ) -cc_test( - name = "friend_connection_test", - size = "small", - srcs = ["friend_connection_test.cc"], - deps = [ - ":friend_connection", - "@com_google_googletest//:gtest", - "@com_google_googletest//:gtest_main", - ], -) - cc_library( name = "friend_requests", srcs = ["friend_requests.c"], @@ -903,6 +892,19 @@ cc_test( ], ) +cc_library( + name = "tox_pack", + srcs = ["tox_pack.c"], + hdrs = ["tox_pack.h"], + visibility = ["//c-toxcore:__subpackages__"], + deps = [ + ":attributes", + ":bin_pack", + ":ccompat", + ":tox", + ], +) + cc_library( name = "tox_unpack", srcs = ["tox_unpack.c"], @@ -937,6 +939,7 @@ cc_library( ":ccompat", ":mem", ":tox", + ":tox_pack", ":tox_unpack", "//c-toxcore/third_party:cmp", ], diff --git a/toxcore/Makefile.inc b/toxcore/Makefile.inc index 5783c91..0663171 100644 --- a/toxcore/Makefile.inc +++ b/toxcore/Makefile.inc @@ -94,6 +94,8 @@ libtoxcore_la_SOURCES = ../third_party/cmp/cmp.c \ ../toxcore/tox_event.c \ ../toxcore/tox_events.h \ ../toxcore/tox_events.c \ + ../toxcore/tox_pack.h \ + ../toxcore/tox_pack.c \ ../toxcore/tox_unpack.h \ ../toxcore/tox_unpack.c \ ../toxcore/tox_private.c \ diff --git a/toxcore/events/conference_connected.c b/toxcore/events/conference_connected.c index 39169ab..80834bf 100644 --- a/toxcore/events/conference_connected.c +++ b/toxcore/events/conference_connected.c @@ -54,10 +54,7 @@ static void tox_event_conference_connected_destruct(Tox_Event_Conference_Connect bool tox_event_conference_connected_pack( const Tox_Event_Conference_Connected *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_CONFERENCE_CONNECTED) - && bin_pack_u32(bp, event->conference_number); + return bin_pack_u32(bp, event->conference_number); } non_null() diff --git a/toxcore/events/conference_invite.c b/toxcore/events/conference_invite.c index e48b061..30d9ff9 100644 --- a/toxcore/events/conference_invite.c +++ b/toxcore/events/conference_invite.c @@ -14,6 +14,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -107,12 +108,9 @@ static void tox_event_conference_invite_destruct(Tox_Event_Conference_Invite *co bool tox_event_conference_invite_pack( const Tox_Event_Conference_Invite *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_CONFERENCE_INVITE) - && bin_pack_array(bp, 3) + return bin_pack_array(bp, 3) && bin_pack_u32(bp, event->friend_number) - && bin_pack_u32(bp, event->type) + && tox_conference_type_pack(event->type, bp) && bin_pack_bin(bp, event->cookie, event->cookie_length); } @@ -126,7 +124,7 @@ static bool tox_event_conference_invite_unpack_into( } return bin_unpack_u32(bu, &event->friend_number) - && tox_conference_type_unpack(bu, &event->type) + && tox_conference_type_unpack(&event->type, bu) && bin_unpack_bin(bu, &event->cookie, &event->cookie_length); } diff --git a/toxcore/events/conference_message.c b/toxcore/events/conference_message.c index 4939af7..818f555 100644 --- a/toxcore/events/conference_message.c +++ b/toxcore/events/conference_message.c @@ -14,6 +14,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -121,13 +122,10 @@ static void tox_event_conference_message_destruct(Tox_Event_Conference_Message * bool tox_event_conference_message_pack( const Tox_Event_Conference_Message *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_CONFERENCE_MESSAGE) - && bin_pack_array(bp, 4) + return bin_pack_array(bp, 4) && bin_pack_u32(bp, event->conference_number) && bin_pack_u32(bp, event->peer_number) - && bin_pack_u32(bp, event->type) + && tox_message_type_pack(event->type, bp) && bin_pack_bin(bp, event->message, event->message_length); } @@ -142,7 +140,7 @@ static bool tox_event_conference_message_unpack_into( return bin_unpack_u32(bu, &event->conference_number) && bin_unpack_u32(bu, &event->peer_number) - && tox_message_type_unpack(bu, &event->type) + && tox_message_type_unpack(&event->type, bu) && bin_unpack_bin(bu, &event->message, &event->message_length); } diff --git a/toxcore/events/conference_peer_list_changed.c b/toxcore/events/conference_peer_list_changed.c index 9c9340c..37b9756 100644 --- a/toxcore/events/conference_peer_list_changed.c +++ b/toxcore/events/conference_peer_list_changed.c @@ -54,10 +54,7 @@ static void tox_event_conference_peer_list_changed_destruct(Tox_Event_Conference bool tox_event_conference_peer_list_changed_pack( const Tox_Event_Conference_Peer_List_Changed *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_CONFERENCE_PEER_LIST_CHANGED) - && bin_pack_u32(bp, event->conference_number); + return bin_pack_u32(bp, event->conference_number); } non_null() diff --git a/toxcore/events/conference_peer_name.c b/toxcore/events/conference_peer_name.c index ad6b9e1..27cba5a 100644 --- a/toxcore/events/conference_peer_name.c +++ b/toxcore/events/conference_peer_name.c @@ -106,10 +106,7 @@ static void tox_event_conference_peer_name_destruct(Tox_Event_Conference_Peer_Na bool tox_event_conference_peer_name_pack( const Tox_Event_Conference_Peer_Name *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_CONFERENCE_PEER_NAME) - && bin_pack_array(bp, 3) + return bin_pack_array(bp, 3) && bin_pack_u32(bp, event->conference_number) && bin_pack_u32(bp, event->peer_number) && bin_pack_bin(bp, event->name, event->name_length); diff --git a/toxcore/events/conference_title.c b/toxcore/events/conference_title.c index 1532ba5..1a00e64 100644 --- a/toxcore/events/conference_title.c +++ b/toxcore/events/conference_title.c @@ -106,10 +106,7 @@ static void tox_event_conference_title_destruct(Tox_Event_Conference_Title *conf bool tox_event_conference_title_pack( const Tox_Event_Conference_Title *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_CONFERENCE_TITLE) - && bin_pack_array(bp, 3) + return bin_pack_array(bp, 3) && bin_pack_u32(bp, event->conference_number) && bin_pack_u32(bp, event->peer_number) && bin_pack_bin(bp, event->title, event->title_length); diff --git a/toxcore/events/file_chunk_request.c b/toxcore/events/file_chunk_request.c index 0bf5864..a83bbd4 100644 --- a/toxcore/events/file_chunk_request.c +++ b/toxcore/events/file_chunk_request.c @@ -96,10 +96,7 @@ static void tox_event_file_chunk_request_destruct(Tox_Event_File_Chunk_Request * bool tox_event_file_chunk_request_pack( const Tox_Event_File_Chunk_Request *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_FILE_CHUNK_REQUEST) - && bin_pack_array(bp, 4) + return bin_pack_array(bp, 4) && bin_pack_u32(bp, event->friend_number) && bin_pack_u32(bp, event->file_number) && bin_pack_u64(bp, event->position) diff --git a/toxcore/events/file_recv.c b/toxcore/events/file_recv.c index 25ea703..a870857 100644 --- a/toxcore/events/file_recv.c +++ b/toxcore/events/file_recv.c @@ -134,10 +134,7 @@ static void tox_event_file_recv_destruct(Tox_Event_File_Recv *file_recv, const M bool tox_event_file_recv_pack( const Tox_Event_File_Recv *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_FILE_RECV) - && bin_pack_array(bp, 5) + return bin_pack_array(bp, 5) && bin_pack_u32(bp, event->friend_number) && bin_pack_u32(bp, event->file_number) && bin_pack_u32(bp, event->kind) diff --git a/toxcore/events/file_recv_chunk.c b/toxcore/events/file_recv_chunk.c index eda5818..9573125 100644 --- a/toxcore/events/file_recv_chunk.c +++ b/toxcore/events/file_recv_chunk.c @@ -120,10 +120,7 @@ static void tox_event_file_recv_chunk_destruct(Tox_Event_File_Recv_Chunk *file_r bool tox_event_file_recv_chunk_pack( const Tox_Event_File_Recv_Chunk *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_FILE_RECV_CHUNK) - && bin_pack_array(bp, 4) + return bin_pack_array(bp, 4) && bin_pack_u32(bp, event->friend_number) && bin_pack_u32(bp, event->file_number) && bin_pack_u64(bp, event->position) diff --git a/toxcore/events/file_recv_control.c b/toxcore/events/file_recv_control.c index e9aac24..0fc26ae 100644 --- a/toxcore/events/file_recv_control.c +++ b/toxcore/events/file_recv_control.c @@ -12,6 +12,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -83,13 +84,10 @@ static void tox_event_file_recv_control_destruct(Tox_Event_File_Recv_Control *fi bool tox_event_file_recv_control_pack( const Tox_Event_File_Recv_Control *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_FILE_RECV_CONTROL) - && bin_pack_array(bp, 3) + return bin_pack_array(bp, 3) && bin_pack_u32(bp, event->friend_number) && bin_pack_u32(bp, event->file_number) - && bin_pack_u32(bp, event->control); + && tox_file_control_pack(event->control, bp); } non_null() @@ -103,7 +101,7 @@ static bool tox_event_file_recv_control_unpack_into( return bin_unpack_u32(bu, &event->friend_number) && bin_unpack_u32(bu, &event->file_number) - && tox_file_control_unpack(bu, &event->control); + && tox_file_control_unpack(&event->control, bu); } diff --git a/toxcore/events/friend_connection_status.c b/toxcore/events/friend_connection_status.c index 9eded8b..4e158e0 100644 --- a/toxcore/events/friend_connection_status.c +++ b/toxcore/events/friend_connection_status.c @@ -12,6 +12,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -69,12 +70,9 @@ static void tox_event_friend_connection_status_destruct(Tox_Event_Friend_Connect bool tox_event_friend_connection_status_pack( const Tox_Event_Friend_Connection_Status *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_FRIEND_CONNECTION_STATUS) - && bin_pack_array(bp, 2) && bin_pack_u32(bp, event->friend_number) - && bin_pack_u32(bp, event->connection_status); + && tox_connection_pack(event->connection_status, bp); } non_null() @@ -87,7 +85,7 @@ static bool tox_event_friend_connection_status_unpack_into( } return bin_unpack_u32(bu, &event->friend_number) - && tox_connection_unpack(bu, &event->connection_status); + && tox_connection_unpack(&event->connection_status, bu); } diff --git a/toxcore/events/friend_lossless_packet.c b/toxcore/events/friend_lossless_packet.c index 2d5da3b..a21af28 100644 --- a/toxcore/events/friend_lossless_packet.c +++ b/toxcore/events/friend_lossless_packet.c @@ -92,10 +92,7 @@ static void tox_event_friend_lossless_packet_destruct(Tox_Event_Friend_Lossless_ bool tox_event_friend_lossless_packet_pack( const Tox_Event_Friend_Lossless_Packet *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_FRIEND_LOSSLESS_PACKET) - && bin_pack_array(bp, 2) && bin_pack_u32(bp, event->friend_number) && bin_pack_bin(bp, event->data, event->data_length); } diff --git a/toxcore/events/friend_lossy_packet.c b/toxcore/events/friend_lossy_packet.c index d7319f5..efbf203 100644 --- a/toxcore/events/friend_lossy_packet.c +++ b/toxcore/events/friend_lossy_packet.c @@ -92,10 +92,7 @@ static void tox_event_friend_lossy_packet_destruct(Tox_Event_Friend_Lossy_Packet bool tox_event_friend_lossy_packet_pack( const Tox_Event_Friend_Lossy_Packet *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_FRIEND_LOSSY_PACKET) - && bin_pack_array(bp, 2) && bin_pack_u32(bp, event->friend_number) && bin_pack_bin(bp, event->data, event->data_length); } diff --git a/toxcore/events/friend_message.c b/toxcore/events/friend_message.c index 2149549..ef917ac 100644 --- a/toxcore/events/friend_message.c +++ b/toxcore/events/friend_message.c @@ -14,6 +14,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -107,12 +108,9 @@ static void tox_event_friend_message_destruct(Tox_Event_Friend_Message *friend_m bool tox_event_friend_message_pack( const Tox_Event_Friend_Message *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_FRIEND_MESSAGE) - && bin_pack_array(bp, 3) + return bin_pack_array(bp, 3) && bin_pack_u32(bp, event->friend_number) - && bin_pack_u32(bp, event->type) + && tox_message_type_pack(event->type, bp) && bin_pack_bin(bp, event->message, event->message_length); } @@ -126,7 +124,7 @@ static bool tox_event_friend_message_unpack_into( } return bin_unpack_u32(bu, &event->friend_number) - && tox_message_type_unpack(bu, &event->type) + && tox_message_type_unpack(&event->type, bu) && bin_unpack_bin(bu, &event->message, &event->message_length); } diff --git a/toxcore/events/friend_name.c b/toxcore/events/friend_name.c index 53fa9d8..d371e65 100644 --- a/toxcore/events/friend_name.c +++ b/toxcore/events/friend_name.c @@ -92,10 +92,7 @@ static void tox_event_friend_name_destruct(Tox_Event_Friend_Name *friend_name, c bool tox_event_friend_name_pack( const Tox_Event_Friend_Name *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_FRIEND_NAME) - && bin_pack_array(bp, 2) && bin_pack_u32(bp, event->friend_number) && bin_pack_bin(bp, event->name, event->name_length); } diff --git a/toxcore/events/friend_read_receipt.c b/toxcore/events/friend_read_receipt.c index 8c88b41..f52fc37 100644 --- a/toxcore/events/friend_read_receipt.c +++ b/toxcore/events/friend_read_receipt.c @@ -68,10 +68,7 @@ static void tox_event_friend_read_receipt_destruct(Tox_Event_Friend_Read_Receipt bool tox_event_friend_read_receipt_pack( const Tox_Event_Friend_Read_Receipt *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_FRIEND_READ_RECEIPT) - && bin_pack_array(bp, 2) && bin_pack_u32(bp, event->friend_number) && bin_pack_u32(bp, event->message_id); } diff --git a/toxcore/events/friend_request.c b/toxcore/events/friend_request.c index 4a19360..70f468c 100644 --- a/toxcore/events/friend_request.c +++ b/toxcore/events/friend_request.c @@ -93,10 +93,7 @@ static void tox_event_friend_request_destruct(Tox_Event_Friend_Request *friend_r bool tox_event_friend_request_pack( const Tox_Event_Friend_Request *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_FRIEND_REQUEST) - && bin_pack_array(bp, 2) && bin_pack_bin(bp, event->public_key, TOX_PUBLIC_KEY_SIZE) && bin_pack_bin(bp, event->message, event->message_length); } diff --git a/toxcore/events/friend_status.c b/toxcore/events/friend_status.c index 1b0a8a4..55e6065 100644 --- a/toxcore/events/friend_status.c +++ b/toxcore/events/friend_status.c @@ -12,6 +12,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -69,12 +70,9 @@ static void tox_event_friend_status_destruct(Tox_Event_Friend_Status *friend_sta bool tox_event_friend_status_pack( const Tox_Event_Friend_Status *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_FRIEND_STATUS) - && bin_pack_array(bp, 2) && bin_pack_u32(bp, event->friend_number) - && bin_pack_u32(bp, event->status); + && tox_user_status_pack(event->status, bp); } non_null() @@ -87,7 +85,7 @@ static bool tox_event_friend_status_unpack_into( } return bin_unpack_u32(bu, &event->friend_number) - && tox_user_status_unpack(bu, &event->status); + && tox_user_status_unpack(&event->status, bu); } diff --git a/toxcore/events/friend_status_message.c b/toxcore/events/friend_status_message.c index 876a9f7..400f7ff 100644 --- a/toxcore/events/friend_status_message.c +++ b/toxcore/events/friend_status_message.c @@ -92,10 +92,7 @@ static void tox_event_friend_status_message_destruct(Tox_Event_Friend_Status_Mes bool tox_event_friend_status_message_pack( const Tox_Event_Friend_Status_Message *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_FRIEND_STATUS_MESSAGE) - && bin_pack_array(bp, 2) && bin_pack_u32(bp, event->friend_number) && bin_pack_bin(bp, event->message, event->message_length); } diff --git a/toxcore/events/friend_typing.c b/toxcore/events/friend_typing.c index 80458e7..9b09997 100644 --- a/toxcore/events/friend_typing.c +++ b/toxcore/events/friend_typing.c @@ -68,10 +68,7 @@ static void tox_event_friend_typing_destruct(Tox_Event_Friend_Typing *friend_typ bool tox_event_friend_typing_pack( const Tox_Event_Friend_Typing *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_FRIEND_TYPING) - && bin_pack_array(bp, 2) && bin_pack_u32(bp, event->friend_number) && bin_pack_bool(bp, event->typing); } diff --git a/toxcore/events/group_custom_packet.c b/toxcore/events/group_custom_packet.c index a265ee4..acc8a39 100644 --- a/toxcore/events/group_custom_packet.c +++ b/toxcore/events/group_custom_packet.c @@ -106,10 +106,7 @@ static void tox_event_group_custom_packet_destruct(Tox_Event_Group_Custom_Packet bool tox_event_group_custom_packet_pack( const Tox_Event_Group_Custom_Packet *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_CUSTOM_PACKET) - && bin_pack_array(bp, 3) + return bin_pack_array(bp, 3) && bin_pack_u32(bp, event->group_number) && bin_pack_u32(bp, event->peer_id) && bin_pack_bin(bp, event->data, event->data_length); diff --git a/toxcore/events/group_custom_private_packet.c b/toxcore/events/group_custom_private_packet.c index bcb7cb3..65d95a6 100644 --- a/toxcore/events/group_custom_private_packet.c +++ b/toxcore/events/group_custom_private_packet.c @@ -106,10 +106,7 @@ static void tox_event_group_custom_private_packet_destruct(Tox_Event_Group_Custo bool tox_event_group_custom_private_packet_pack( const Tox_Event_Group_Custom_Private_Packet *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_CUSTOM_PRIVATE_PACKET) - && bin_pack_array(bp, 3) + return bin_pack_array(bp, 3) && bin_pack_u32(bp, event->group_number) && bin_pack_u32(bp, event->peer_id) && bin_pack_bin(bp, event->data, event->data_length); diff --git a/toxcore/events/group_invite.c b/toxcore/events/group_invite.c index 97fad95..30e3429 100644 --- a/toxcore/events/group_invite.c +++ b/toxcore/events/group_invite.c @@ -129,10 +129,7 @@ static void tox_event_group_invite_destruct(Tox_Event_Group_Invite *group_invite bool tox_event_group_invite_pack( const Tox_Event_Group_Invite *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_INVITE) - && bin_pack_array(bp, 3) + return bin_pack_array(bp, 3) && bin_pack_u32(bp, event->friend_number) && bin_pack_bin(bp, event->invite_data, event->invite_data_length) && bin_pack_bin(bp, event->group_name, event->group_name_length); diff --git a/toxcore/events/group_join_fail.c b/toxcore/events/group_join_fail.c index 10a9516..8856568 100644 --- a/toxcore/events/group_join_fail.c +++ b/toxcore/events/group_join_fail.c @@ -12,6 +12,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -69,12 +70,9 @@ static void tox_event_group_join_fail_destruct(Tox_Event_Group_Join_Fail *group_ bool tox_event_group_join_fail_pack( const Tox_Event_Group_Join_Fail *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_JOIN_FAIL) - && bin_pack_array(bp, 2) && bin_pack_u32(bp, event->group_number) - && bin_pack_u32(bp, event->fail_type); + && tox_group_join_fail_pack(event->fail_type, bp); } non_null() @@ -87,7 +85,7 @@ static bool tox_event_group_join_fail_unpack_into( } return bin_unpack_u32(bu, &event->group_number) - && tox_group_join_fail_unpack(bu, &event->fail_type); + && tox_group_join_fail_unpack(&event->fail_type, bu); } diff --git a/toxcore/events/group_message.c b/toxcore/events/group_message.c index 06a04a7..2bdad4e 100644 --- a/toxcore/events/group_message.c +++ b/toxcore/events/group_message.c @@ -14,6 +14,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -135,13 +136,10 @@ static void tox_event_group_message_destruct(Tox_Event_Group_Message *group_mess bool tox_event_group_message_pack( const Tox_Event_Group_Message *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_MESSAGE) - && bin_pack_array(bp, 5) + return bin_pack_array(bp, 5) && bin_pack_u32(bp, event->group_number) && bin_pack_u32(bp, event->peer_id) - && bin_pack_u32(bp, event->type) + && tox_message_type_pack(event->type, bp) && bin_pack_bin(bp, event->message, event->message_length) && bin_pack_u32(bp, event->message_id); } @@ -157,7 +155,7 @@ static bool tox_event_group_message_unpack_into( return bin_unpack_u32(bu, &event->group_number) && bin_unpack_u32(bu, &event->peer_id) - && tox_message_type_unpack(bu, &event->type) + && tox_message_type_unpack(&event->type, bu) && bin_unpack_bin(bu, &event->message, &event->message_length) && bin_unpack_u32(bu, &event->message_id); } diff --git a/toxcore/events/group_moderation.c b/toxcore/events/group_moderation.c index f728a27..7ac46ff 100644 --- a/toxcore/events/group_moderation.c +++ b/toxcore/events/group_moderation.c @@ -12,6 +12,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -97,14 +98,11 @@ static void tox_event_group_moderation_destruct(Tox_Event_Group_Moderation *grou bool tox_event_group_moderation_pack( const Tox_Event_Group_Moderation *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_MODERATION) - && bin_pack_array(bp, 4) + return bin_pack_array(bp, 4) && bin_pack_u32(bp, event->group_number) && bin_pack_u32(bp, event->source_peer_id) && bin_pack_u32(bp, event->target_peer_id) - && bin_pack_u32(bp, event->mod_type); + && tox_group_mod_event_pack(event->mod_type, bp); } non_null() @@ -119,7 +117,7 @@ static bool tox_event_group_moderation_unpack_into( return bin_unpack_u32(bu, &event->group_number) && bin_unpack_u32(bu, &event->source_peer_id) && bin_unpack_u32(bu, &event->target_peer_id) - && tox_group_mod_event_unpack(bu, &event->mod_type); + && tox_group_mod_event_unpack(&event->mod_type, bu); } diff --git a/toxcore/events/group_password.c b/toxcore/events/group_password.c index 6f19bd5..cbfedd3 100644 --- a/toxcore/events/group_password.c +++ b/toxcore/events/group_password.c @@ -92,10 +92,7 @@ static void tox_event_group_password_destruct(Tox_Event_Group_Password *group_pa bool tox_event_group_password_pack( const Tox_Event_Group_Password *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_PASSWORD) - && bin_pack_array(bp, 2) && bin_pack_u32(bp, event->group_number) && bin_pack_bin(bp, event->password, event->password_length); } diff --git a/toxcore/events/group_peer_exit.c b/toxcore/events/group_peer_exit.c index 5a94cc2..fd56fd6 100644 --- a/toxcore/events/group_peer_exit.c +++ b/toxcore/events/group_peer_exit.c @@ -14,6 +14,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -158,13 +159,10 @@ static void tox_event_group_peer_exit_destruct(Tox_Event_Group_Peer_Exit *group_ bool tox_event_group_peer_exit_pack( const Tox_Event_Group_Peer_Exit *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_PEER_EXIT) - && bin_pack_array(bp, 5) + return bin_pack_array(bp, 5) && bin_pack_u32(bp, event->group_number) && bin_pack_u32(bp, event->peer_id) - && bin_pack_u32(bp, event->exit_type) + && tox_group_exit_type_pack(event->exit_type, bp) && bin_pack_bin(bp, event->name, event->name_length) && bin_pack_bin(bp, event->part_message, event->part_message_length); } @@ -180,7 +178,7 @@ static bool tox_event_group_peer_exit_unpack_into( return bin_unpack_u32(bu, &event->group_number) && bin_unpack_u32(bu, &event->peer_id) - && tox_group_exit_type_unpack(bu, &event->exit_type) + && tox_group_exit_type_unpack(&event->exit_type, bu) && bin_unpack_bin(bu, &event->name, &event->name_length) && bin_unpack_bin(bu, &event->part_message, &event->part_message_length); } diff --git a/toxcore/events/group_peer_join.c b/toxcore/events/group_peer_join.c index ec366cf..c587c17 100644 --- a/toxcore/events/group_peer_join.c +++ b/toxcore/events/group_peer_join.c @@ -68,10 +68,7 @@ static void tox_event_group_peer_join_destruct(Tox_Event_Group_Peer_Join *group_ bool tox_event_group_peer_join_pack( const Tox_Event_Group_Peer_Join *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_PEER_JOIN) - && bin_pack_array(bp, 2) && bin_pack_u32(bp, event->group_number) && bin_pack_u32(bp, event->peer_id); } diff --git a/toxcore/events/group_peer_limit.c b/toxcore/events/group_peer_limit.c index 7e37cef..9a2daa7 100644 --- a/toxcore/events/group_peer_limit.c +++ b/toxcore/events/group_peer_limit.c @@ -68,10 +68,7 @@ static void tox_event_group_peer_limit_destruct(Tox_Event_Group_Peer_Limit *grou bool tox_event_group_peer_limit_pack( const Tox_Event_Group_Peer_Limit *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_PEER_LIMIT) - && bin_pack_array(bp, 2) && bin_pack_u32(bp, event->group_number) && bin_pack_u32(bp, event->peer_limit); } diff --git a/toxcore/events/group_peer_name.c b/toxcore/events/group_peer_name.c index e81ee04..6d6f77d 100644 --- a/toxcore/events/group_peer_name.c +++ b/toxcore/events/group_peer_name.c @@ -106,10 +106,7 @@ static void tox_event_group_peer_name_destruct(Tox_Event_Group_Peer_Name *group_ bool tox_event_group_peer_name_pack( const Tox_Event_Group_Peer_Name *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_PEER_NAME) - && bin_pack_array(bp, 3) + return bin_pack_array(bp, 3) && bin_pack_u32(bp, event->group_number) && bin_pack_u32(bp, event->peer_id) && bin_pack_bin(bp, event->name, event->name_length); diff --git a/toxcore/events/group_peer_status.c b/toxcore/events/group_peer_status.c index 8bf456f..2cfe32e 100644 --- a/toxcore/events/group_peer_status.c +++ b/toxcore/events/group_peer_status.c @@ -12,6 +12,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -83,13 +84,10 @@ static void tox_event_group_peer_status_destruct(Tox_Event_Group_Peer_Status *gr bool tox_event_group_peer_status_pack( const Tox_Event_Group_Peer_Status *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_PEER_STATUS) - && bin_pack_array(bp, 3) + return bin_pack_array(bp, 3) && bin_pack_u32(bp, event->group_number) && bin_pack_u32(bp, event->peer_id) - && bin_pack_u32(bp, event->status); + && tox_user_status_pack(event->status, bp); } non_null() @@ -103,7 +101,7 @@ static bool tox_event_group_peer_status_unpack_into( return bin_unpack_u32(bu, &event->group_number) && bin_unpack_u32(bu, &event->peer_id) - && tox_user_status_unpack(bu, &event->status); + && tox_user_status_unpack(&event->status, bu); } diff --git a/toxcore/events/group_privacy_state.c b/toxcore/events/group_privacy_state.c index e82e423..8623668 100644 --- a/toxcore/events/group_privacy_state.c +++ b/toxcore/events/group_privacy_state.c @@ -12,6 +12,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -69,12 +70,9 @@ static void tox_event_group_privacy_state_destruct(Tox_Event_Group_Privacy_State bool tox_event_group_privacy_state_pack( const Tox_Event_Group_Privacy_State *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_PRIVACY_STATE) - && bin_pack_array(bp, 2) && bin_pack_u32(bp, event->group_number) - && bin_pack_u32(bp, event->privacy_state); + && tox_group_privacy_state_pack(event->privacy_state, bp); } non_null() @@ -87,7 +85,7 @@ static bool tox_event_group_privacy_state_unpack_into( } return bin_unpack_u32(bu, &event->group_number) - && tox_group_privacy_state_unpack(bu, &event->privacy_state); + && tox_group_privacy_state_unpack(&event->privacy_state, bu); } diff --git a/toxcore/events/group_private_message.c b/toxcore/events/group_private_message.c index efa62fb..acd7a71 100644 --- a/toxcore/events/group_private_message.c +++ b/toxcore/events/group_private_message.c @@ -14,6 +14,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -121,13 +122,10 @@ static void tox_event_group_private_message_destruct(Tox_Event_Group_Private_Mes bool tox_event_group_private_message_pack( const Tox_Event_Group_Private_Message *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_PRIVATE_MESSAGE) - && bin_pack_array(bp, 4) + return bin_pack_array(bp, 4) && bin_pack_u32(bp, event->group_number) && bin_pack_u32(bp, event->peer_id) - && bin_pack_u32(bp, event->type) + && tox_message_type_pack(event->type, bp) && bin_pack_bin(bp, event->message, event->message_length); } @@ -142,7 +140,7 @@ static bool tox_event_group_private_message_unpack_into( return bin_unpack_u32(bu, &event->group_number) && bin_unpack_u32(bu, &event->peer_id) - && tox_message_type_unpack(bu, &event->type) + && tox_message_type_unpack(&event->type, bu) && bin_unpack_bin(bu, &event->message, &event->message_length); } diff --git a/toxcore/events/group_self_join.c b/toxcore/events/group_self_join.c index ceca661..904a3e5 100644 --- a/toxcore/events/group_self_join.c +++ b/toxcore/events/group_self_join.c @@ -54,10 +54,7 @@ static void tox_event_group_self_join_destruct(Tox_Event_Group_Self_Join *group_ bool tox_event_group_self_join_pack( const Tox_Event_Group_Self_Join *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_SELF_JOIN) - && bin_pack_u32(bp, event->group_number); + return bin_pack_u32(bp, event->group_number); } non_null() diff --git a/toxcore/events/group_topic.c b/toxcore/events/group_topic.c index 48f5ed7..3a62024 100644 --- a/toxcore/events/group_topic.c +++ b/toxcore/events/group_topic.c @@ -106,10 +106,7 @@ static void tox_event_group_topic_destruct(Tox_Event_Group_Topic *group_topic, c bool tox_event_group_topic_pack( const Tox_Event_Group_Topic *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_TOPIC) - && bin_pack_array(bp, 3) + return bin_pack_array(bp, 3) && bin_pack_u32(bp, event->group_number) && bin_pack_u32(bp, event->peer_id) && bin_pack_bin(bp, event->topic, event->topic_length); diff --git a/toxcore/events/group_topic_lock.c b/toxcore/events/group_topic_lock.c index 17d7102..82d37a1 100644 --- a/toxcore/events/group_topic_lock.c +++ b/toxcore/events/group_topic_lock.c @@ -12,6 +12,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -69,12 +70,9 @@ static void tox_event_group_topic_lock_destruct(Tox_Event_Group_Topic_Lock *grou bool tox_event_group_topic_lock_pack( const Tox_Event_Group_Topic_Lock *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_TOPIC_LOCK) - && bin_pack_array(bp, 2) && bin_pack_u32(bp, event->group_number) - && bin_pack_u32(bp, event->topic_lock); + && tox_group_topic_lock_pack(event->topic_lock, bp); } non_null() @@ -87,7 +85,7 @@ static bool tox_event_group_topic_lock_unpack_into( } return bin_unpack_u32(bu, &event->group_number) - && tox_group_topic_lock_unpack(bu, &event->topic_lock); + && tox_group_topic_lock_unpack(&event->topic_lock, bu); } diff --git a/toxcore/events/group_voice_state.c b/toxcore/events/group_voice_state.c index 053c9ed..7bcfa55 100644 --- a/toxcore/events/group_voice_state.c +++ b/toxcore/events/group_voice_state.c @@ -12,6 +12,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -69,12 +70,9 @@ static void tox_event_group_voice_state_destruct(Tox_Event_Group_Voice_State *gr bool tox_event_group_voice_state_pack( const Tox_Event_Group_Voice_State *event, Bin_Pack *bp) { - assert(event != nullptr); return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_GROUP_VOICE_STATE) - && bin_pack_array(bp, 2) && bin_pack_u32(bp, event->group_number) - && bin_pack_u32(bp, event->voice_state); + && tox_group_voice_state_pack(event->voice_state, bp); } non_null() @@ -87,7 +85,7 @@ static bool tox_event_group_voice_state_unpack_into( } return bin_unpack_u32(bu, &event->group_number) - && tox_group_voice_state_unpack(bu, &event->voice_state); + && tox_group_voice_state_unpack(&event->voice_state, bu); } diff --git a/toxcore/events/self_connection_status.c b/toxcore/events/self_connection_status.c index 945f4bb..417a3fe 100644 --- a/toxcore/events/self_connection_status.c +++ b/toxcore/events/self_connection_status.c @@ -12,6 +12,7 @@ #include "../mem.h" #include "../tox.h" #include "../tox_events.h" +#include "../tox_pack.h" #include "../tox_unpack.h" @@ -55,10 +56,7 @@ static void tox_event_self_connection_status_destruct(Tox_Event_Self_Connection_ bool tox_event_self_connection_status_pack( const Tox_Event_Self_Connection_Status *event, Bin_Pack *bp) { - assert(event != nullptr); - return bin_pack_array(bp, 2) - && bin_pack_u32(bp, TOX_EVENT_SELF_CONNECTION_STATUS) - && bin_pack_u32(bp, event->connection_status); + return tox_connection_pack(event->connection_status, bp); } non_null() @@ -66,7 +64,7 @@ static bool tox_event_self_connection_status_unpack_into( Tox_Event_Self_Connection_Status *event, Bin_Unpack *bu) { assert(event != nullptr); - return tox_connection_unpack(bu, &event->connection_status); + return tox_connection_unpack(&event->connection_status, bu); } diff --git a/toxcore/friend_connection_test.cc b/toxcore/friend_connection_test.cc deleted file mode 100644 index c2d1032..0000000 --- a/toxcore/friend_connection_test.cc +++ /dev/null @@ -1,14 +0,0 @@ -#include "friend_connection.h" - -#include - -namespace { - -// TODO(Jfreegman) make this useful or remove it after NGC is merged -TEST(friend_connection, NullTest) -{ - (void)friend_conn_get_onion_friendnum; - (void)friend_conn_get_dht_ip_port; -} - -} // namespace diff --git a/toxcore/network.c b/toxcore/network.c index 748f1c7..9c8bfdd 100644 --- a/toxcore/network.c +++ b/toxcore/network.c @@ -946,8 +946,9 @@ int send_packet(const Networking_Core *net, const IP_Port *ip_port, Packet packe if (net_family_is_ipv4(net->family) && !net_family_is_ipv4(ipp_copy.ip.family)) { // TODO(iphydf): Make this an error. Occasionally we try to send to an // all-zero ip_port. - LOGGER_WARNING(net->log, "attempted to send message with network family %d (probably IPv6) on IPv4 socket", - ipp_copy.ip.family.value); + Ip_Ntoa ip_str; + LOGGER_WARNING(net->log, "attempted to send message with network family %d (probably IPv6) on IPv4 socket (%s)", + ipp_copy.ip.family.value, net_ip_ntoa(&ipp_copy.ip, &ip_str)); return -1; } diff --git a/toxcore/onion.c b/toxcore/onion.c index ae201cf..0c4dfa5 100644 --- a/toxcore/onion.c +++ b/toxcore/onion.c @@ -48,7 +48,7 @@ static void change_symmetric_key(Onion *onion) /** packing and unpacking functions */ non_null() -static void ip_pack(uint8_t *data, const IP *source) +static void ip_pack_to_bytes(uint8_t *data, const IP *source) { data[0] = source->family.value; @@ -62,7 +62,7 @@ static void ip_pack(uint8_t *data, const IP *source) /** return 0 on success, -1 on failure. */ non_null() -static int ip_unpack(IP *target, const uint8_t *data, unsigned int data_size, bool disable_family_check) +static int ip_unpack_from_bytes(IP *target, const uint8_t *data, unsigned int data_size, bool disable_family_check) { if (data_size < (1 + SIZE_IP6)) { return -1; @@ -87,7 +87,7 @@ static int ip_unpack(IP *target, const uint8_t *data, unsigned int data_size, bo non_null() static void ipport_pack(uint8_t *data, const IP_Port *source) { - ip_pack(data, &source->ip); + ip_pack_to_bytes(data, &source->ip); memcpy(data + SIZE_IP, &source->port, SIZE_PORT); } @@ -99,7 +99,7 @@ static int ipport_unpack(IP_Port *target, const uint8_t *data, unsigned int data return -1; } - if (ip_unpack(&target->ip, data, data_size, disable_family_check) == -1) { + if (ip_unpack_from_bytes(&target->ip, data, data_size, disable_family_check) == -1) { return -1; } diff --git a/toxcore/tox.c b/toxcore/tox.c index 4c6665d..15fe74c 100644 --- a/toxcore/tox.c +++ b/toxcore/tox.c @@ -1058,6 +1058,11 @@ bool tox_bootstrap(Tox *tox, const char *host, uint16_t port, const uint8_t publ bool udp_success = tox->m->options.udp_disabled; for (int32_t i = 0; i < count; ++i) { + if (!tox->m->options.ipv6enabled && net_family_is_ipv6(root[i].ip.family)) { + // We can't use ipv6 when it's disabled. + continue; + } + root[i].port = net_htons(port); if (onion_add_bs_path_node(tox->m->onion_c, &root[i], public_key)) { diff --git a/toxcore/tox_event.c b/toxcore/tox_event.c index d7ac2a9..9a4ee81 100644 --- a/toxcore/tox_event.c +++ b/toxcore/tox_event.c @@ -564,127 +564,132 @@ void tox_event_destruct(Tox_Event *event, const Memory *mem) event->data.value = nullptr; } -bool tox_event_pack(const Tox_Event *event, Bin_Pack *bp) +non_null() +static bool tox_event_type_pack(Tox_Event_Type type, Bin_Pack *bp) { - assert(event->type != TOX_EVENT_INVALID); + return bin_pack_u32(bp, (uint32_t)type); +} - switch (event->type) { +non_null() +static bool tox_event_data_pack(Tox_Event_Type type, const Tox_Event_Data *data, Bin_Pack *bp) +{ + switch (type) { case TOX_EVENT_CONFERENCE_CONNECTED: - return tox_event_conference_connected_pack(event->data.conference_connected, bp); + return tox_event_conference_connected_pack(data->conference_connected, bp); case TOX_EVENT_CONFERENCE_INVITE: - return tox_event_conference_invite_pack(event->data.conference_invite, bp); + return tox_event_conference_invite_pack(data->conference_invite, bp); case TOX_EVENT_CONFERENCE_MESSAGE: - return tox_event_conference_message_pack(event->data.conference_message, bp); + return tox_event_conference_message_pack(data->conference_message, bp); case TOX_EVENT_CONFERENCE_PEER_LIST_CHANGED: - return tox_event_conference_peer_list_changed_pack(event->data.conference_peer_list_changed, bp); + return tox_event_conference_peer_list_changed_pack(data->conference_peer_list_changed, bp); case TOX_EVENT_CONFERENCE_PEER_NAME: - return tox_event_conference_peer_name_pack(event->data.conference_peer_name, bp); + return tox_event_conference_peer_name_pack(data->conference_peer_name, bp); case TOX_EVENT_CONFERENCE_TITLE: - return tox_event_conference_title_pack(event->data.conference_title, bp); + return tox_event_conference_title_pack(data->conference_title, bp); case TOX_EVENT_FILE_CHUNK_REQUEST: - return tox_event_file_chunk_request_pack(event->data.file_chunk_request, bp); + return tox_event_file_chunk_request_pack(data->file_chunk_request, bp); case TOX_EVENT_FILE_RECV_CHUNK: - return tox_event_file_recv_chunk_pack(event->data.file_recv_chunk, bp); + return tox_event_file_recv_chunk_pack(data->file_recv_chunk, bp); case TOX_EVENT_FILE_RECV_CONTROL: - return tox_event_file_recv_control_pack(event->data.file_recv_control, bp); + return tox_event_file_recv_control_pack(data->file_recv_control, bp); case TOX_EVENT_FILE_RECV: - return tox_event_file_recv_pack(event->data.file_recv, bp); + return tox_event_file_recv_pack(data->file_recv, bp); case TOX_EVENT_FRIEND_CONNECTION_STATUS: - return tox_event_friend_connection_status_pack(event->data.friend_connection_status, bp); + return tox_event_friend_connection_status_pack(data->friend_connection_status, bp); case TOX_EVENT_FRIEND_LOSSLESS_PACKET: - return tox_event_friend_lossless_packet_pack(event->data.friend_lossless_packet, bp); + return tox_event_friend_lossless_packet_pack(data->friend_lossless_packet, bp); case TOX_EVENT_FRIEND_LOSSY_PACKET: - return tox_event_friend_lossy_packet_pack(event->data.friend_lossy_packet, bp); + return tox_event_friend_lossy_packet_pack(data->friend_lossy_packet, bp); case TOX_EVENT_FRIEND_MESSAGE: - return tox_event_friend_message_pack(event->data.friend_message, bp); + return tox_event_friend_message_pack(data->friend_message, bp); case TOX_EVENT_FRIEND_NAME: - return tox_event_friend_name_pack(event->data.friend_name, bp); + return tox_event_friend_name_pack(data->friend_name, bp); case TOX_EVENT_FRIEND_READ_RECEIPT: - return tox_event_friend_read_receipt_pack(event->data.friend_read_receipt, bp); + return tox_event_friend_read_receipt_pack(data->friend_read_receipt, bp); case TOX_EVENT_FRIEND_REQUEST: - return tox_event_friend_request_pack(event->data.friend_request, bp); + return tox_event_friend_request_pack(data->friend_request, bp); case TOX_EVENT_FRIEND_STATUS: - return tox_event_friend_status_pack(event->data.friend_status, bp); + return tox_event_friend_status_pack(data->friend_status, bp); case TOX_EVENT_FRIEND_STATUS_MESSAGE: - return tox_event_friend_status_message_pack(event->data.friend_status_message, bp); + return tox_event_friend_status_message_pack(data->friend_status_message, bp); case TOX_EVENT_FRIEND_TYPING: - return tox_event_friend_typing_pack(event->data.friend_typing, bp); + return tox_event_friend_typing_pack(data->friend_typing, bp); case TOX_EVENT_SELF_CONNECTION_STATUS: - return tox_event_self_connection_status_pack(event->data.self_connection_status, bp); + return tox_event_self_connection_status_pack(data->self_connection_status, bp); case TOX_EVENT_GROUP_PEER_NAME: - return tox_event_group_peer_name_pack(event->data.group_peer_name, bp); + return tox_event_group_peer_name_pack(data->group_peer_name, bp); case TOX_EVENT_GROUP_PEER_STATUS: - return tox_event_group_peer_status_pack(event->data.group_peer_status, bp); + return tox_event_group_peer_status_pack(data->group_peer_status, bp); case TOX_EVENT_GROUP_TOPIC: - return tox_event_group_topic_pack(event->data.group_topic, bp); + return tox_event_group_topic_pack(data->group_topic, bp); case TOX_EVENT_GROUP_PRIVACY_STATE: - return tox_event_group_privacy_state_pack(event->data.group_privacy_state, bp); + return tox_event_group_privacy_state_pack(data->group_privacy_state, bp); case TOX_EVENT_GROUP_VOICE_STATE: - return tox_event_group_voice_state_pack(event->data.group_voice_state, bp); + return tox_event_group_voice_state_pack(data->group_voice_state, bp); case TOX_EVENT_GROUP_TOPIC_LOCK: - return tox_event_group_topic_lock_pack(event->data.group_topic_lock, bp); + return tox_event_group_topic_lock_pack(data->group_topic_lock, bp); case TOX_EVENT_GROUP_PEER_LIMIT: - return tox_event_group_peer_limit_pack(event->data.group_peer_limit, bp); + return tox_event_group_peer_limit_pack(data->group_peer_limit, bp); case TOX_EVENT_GROUP_PASSWORD: - return tox_event_group_password_pack(event->data.group_password, bp); + return tox_event_group_password_pack(data->group_password, bp); case TOX_EVENT_GROUP_MESSAGE: - return tox_event_group_message_pack(event->data.group_message, bp); + return tox_event_group_message_pack(data->group_message, bp); case TOX_EVENT_GROUP_PRIVATE_MESSAGE: - return tox_event_group_private_message_pack(event->data.group_private_message, bp); + return tox_event_group_private_message_pack(data->group_private_message, bp); case TOX_EVENT_GROUP_CUSTOM_PACKET: - return tox_event_group_custom_packet_pack(event->data.group_custom_packet, bp); + return tox_event_group_custom_packet_pack(data->group_custom_packet, bp); case TOX_EVENT_GROUP_CUSTOM_PRIVATE_PACKET: - return tox_event_group_custom_private_packet_pack(event->data.group_custom_private_packet, bp); + return tox_event_group_custom_private_packet_pack(data->group_custom_private_packet, bp); case TOX_EVENT_GROUP_INVITE: - return tox_event_group_invite_pack(event->data.group_invite, bp); + return tox_event_group_invite_pack(data->group_invite, bp); case TOX_EVENT_GROUP_PEER_JOIN: - return tox_event_group_peer_join_pack(event->data.group_peer_join, bp); + return tox_event_group_peer_join_pack(data->group_peer_join, bp); case TOX_EVENT_GROUP_PEER_EXIT: - return tox_event_group_peer_exit_pack(event->data.group_peer_exit, bp); + return tox_event_group_peer_exit_pack(data->group_peer_exit, bp); case TOX_EVENT_GROUP_SELF_JOIN: - return tox_event_group_self_join_pack(event->data.group_self_join, bp); + return tox_event_group_self_join_pack(data->group_self_join, bp); case TOX_EVENT_GROUP_JOIN_FAIL: - return tox_event_group_join_fail_pack(event->data.group_join_fail, bp); + return tox_event_group_join_fail_pack(data->group_join_fail, bp); case TOX_EVENT_GROUP_MODERATION: - return tox_event_group_moderation_pack(event->data.group_moderation, bp); + return tox_event_group_moderation_pack(data->group_moderation, bp); case TOX_EVENT_INVALID: return false; @@ -693,6 +698,15 @@ bool tox_event_pack(const Tox_Event *event, Bin_Pack *bp) return false; } +bool tox_event_pack(const Tox_Event *event, Bin_Pack *bp) +{ + assert(event->type != TOX_EVENT_INVALID); + + return bin_pack_array(bp, 2) + && tox_event_type_pack(event->type, bp) + && tox_event_data_pack(event->type, &event->data, bp); +} + non_null() static bool tox_event_type_from_int(uint32_t value, Tox_Event_Type *out) { diff --git a/toxcore/tox_pack.c b/toxcore/tox_pack.c new file mode 100644 index 0000000..3d584ac --- /dev/null +++ b/toxcore/tox_pack.c @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later + * Copyright © 2022 The TokTok team. + */ + +#include "tox_pack.h" + +#include + +#include "bin_pack.h" +#include "tox.h" + +bool tox_conference_type_pack(Tox_Conference_Type val, Bin_Pack *bp) +{ + return bin_pack_u32(bp, (uint32_t)val); +} +bool tox_connection_pack(Tox_Connection val, Bin_Pack *bp) +{ + return bin_pack_u32(bp, (uint32_t)val); +} +bool tox_file_control_pack(Tox_File_Control val, Bin_Pack *bp) +{ + return bin_pack_u32(bp, (uint32_t)val); +} +bool tox_message_type_pack(Tox_Message_Type val, Bin_Pack *bp) +{ + return bin_pack_u32(bp, (uint32_t)val); +} +bool tox_user_status_pack(Tox_User_Status val, Bin_Pack *bp) +{ + return bin_pack_u32(bp, (uint32_t)val); +} +bool tox_group_privacy_state_pack(Tox_Group_Privacy_State val, Bin_Pack *bp) +{ + return bin_pack_u32(bp, (uint32_t)val); +} +bool tox_group_voice_state_pack(Tox_Group_Voice_State val, Bin_Pack *bp) +{ + return bin_pack_u32(bp, (uint32_t)val); +} +bool tox_group_topic_lock_pack(Tox_Group_Topic_Lock val, Bin_Pack *bp) +{ + return bin_pack_u32(bp, (uint32_t)val); +} +bool tox_group_join_fail_pack(Tox_Group_Join_Fail val, Bin_Pack *bp) +{ + return bin_pack_u32(bp, (uint32_t)val); +} +bool tox_group_mod_event_pack(Tox_Group_Mod_Event val, Bin_Pack *bp) +{ + return bin_pack_u32(bp, (uint32_t)val); +} +bool tox_group_exit_type_pack(Tox_Group_Exit_Type val, Bin_Pack *bp) +{ + return bin_pack_u32(bp, (uint32_t)val); +} diff --git a/toxcore/tox_pack.h b/toxcore/tox_pack.h new file mode 100644 index 0000000..4e554bc --- /dev/null +++ b/toxcore/tox_pack.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later + * Copyright © 2022 The TokTok team. + */ + +#ifndef C_TOXCORE_TOXCORE_TOX_PACK_H +#define C_TOXCORE_TOXCORE_TOX_PACK_H + +#include "attributes.h" +#include "bin_pack.h" +#include "tox.h" + +non_null() bool tox_conference_type_pack(Tox_Conference_Type val, Bin_Pack *bp); +non_null() bool tox_connection_pack(Tox_Connection val, Bin_Pack *bp); +non_null() bool tox_file_control_pack(Tox_File_Control val, Bin_Pack *bp); +non_null() bool tox_message_type_pack(Tox_Message_Type val, Bin_Pack *bp); +non_null() bool tox_user_status_pack(Tox_User_Status val, Bin_Pack *bp); +non_null() bool tox_group_privacy_state_pack(Tox_Group_Privacy_State val, Bin_Pack *bp); +non_null() bool tox_group_voice_state_pack(Tox_Group_Voice_State val, Bin_Pack *bp); +non_null() bool tox_group_topic_lock_pack(Tox_Group_Topic_Lock val, Bin_Pack *bp); +non_null() bool tox_group_join_fail_pack(Tox_Group_Join_Fail val, Bin_Pack *bp); +non_null() bool tox_group_mod_event_pack(Tox_Group_Mod_Event val, Bin_Pack *bp); +non_null() bool tox_group_exit_type_pack(Tox_Group_Exit_Type val, Bin_Pack *bp); + +#endif // C_TOXCORE_TOXCORE_TOX_PACK_H diff --git a/toxcore/tox_unpack.c b/toxcore/tox_unpack.c index 35bffb1..8f30824 100644 --- a/toxcore/tox_unpack.c +++ b/toxcore/tox_unpack.c @@ -29,7 +29,7 @@ static bool tox_conference_type_from_int(uint32_t value, Tox_Conference_Type *ou } } } -bool tox_conference_type_unpack(Bin_Unpack *bu, Tox_Conference_Type *val) +bool tox_conference_type_unpack(Tox_Conference_Type *val, Bin_Unpack *bu) { uint32_t u32; return bin_unpack_u32(bu, &u32) @@ -62,7 +62,7 @@ static bool tox_connection_from_int(uint32_t value, Tox_Connection *out) } } -bool tox_connection_unpack(Bin_Unpack *bu, Tox_Connection *val) +bool tox_connection_unpack(Tox_Connection *val, Bin_Unpack *bu) { uint32_t u32; return bin_unpack_u32(bu, &u32) @@ -95,7 +95,7 @@ static bool tox_file_control_from_int(uint32_t value, Tox_File_Control *out) } } -bool tox_file_control_unpack(Bin_Unpack *bu, Tox_File_Control *val) +bool tox_file_control_unpack(Tox_File_Control *val, Bin_Unpack *bu) { uint32_t u32; return bin_unpack_u32(bu, &u32) @@ -123,7 +123,7 @@ static bool tox_message_type_from_int(uint32_t value, Tox_Message_Type *out) } } -bool tox_message_type_unpack(Bin_Unpack *bu, Tox_Message_Type *val) +bool tox_message_type_unpack(Tox_Message_Type *val, Bin_Unpack *bu) { uint32_t u32; return bin_unpack_u32(bu, &u32) @@ -156,7 +156,7 @@ static bool tox_user_status_from_int(uint32_t value, Tox_User_Status *out) } } -bool tox_user_status_unpack(Bin_Unpack *bu, Tox_User_Status *val) +bool tox_user_status_unpack(Tox_User_Status *val, Bin_Unpack *bu) { uint32_t u32; return bin_unpack_u32(bu, &u32) @@ -181,7 +181,7 @@ static bool tox_group_privacy_state_from_int(uint32_t value, Tox_Group_Privacy_S } } } -bool tox_group_privacy_state_unpack(Bin_Unpack *bu, Tox_Group_Privacy_State *val) +bool tox_group_privacy_state_unpack(Tox_Group_Privacy_State *val, Bin_Unpack *bu) { uint32_t u32; return bin_unpack_u32(bu, &u32) @@ -209,7 +209,7 @@ static bool tox_group_voice_state_from_int(uint32_t value, Tox_Group_Voice_State } } } -bool tox_group_voice_state_unpack(Bin_Unpack *bu, Tox_Group_Voice_State *val) +bool tox_group_voice_state_unpack(Tox_Group_Voice_State *val, Bin_Unpack *bu) { uint32_t u32; return bin_unpack_u32(bu, &u32) @@ -234,7 +234,7 @@ static bool tox_group_topic_lock_from_int(uint32_t value, Tox_Group_Topic_Lock * } } } -bool tox_group_topic_lock_unpack(Bin_Unpack *bu, Tox_Group_Topic_Lock *val) +bool tox_group_topic_lock_unpack(Tox_Group_Topic_Lock *val, Bin_Unpack *bu) { uint32_t u32; return bin_unpack_u32(bu, &u32) @@ -263,7 +263,7 @@ static bool tox_group_join_fail_from_int(uint32_t value, Tox_Group_Join_Fail *ou } } } -bool tox_group_join_fail_unpack(Bin_Unpack *bu, Tox_Group_Join_Fail *val) +bool tox_group_join_fail_unpack(Tox_Group_Join_Fail *val, Bin_Unpack *bu) { uint32_t u32; return bin_unpack_u32(bu, &u32) @@ -296,7 +296,7 @@ static bool tox_group_mod_event_from_int(uint32_t value, Tox_Group_Mod_Event *ou } } } -bool tox_group_mod_event_unpack(Bin_Unpack *bu, Tox_Group_Mod_Event *val) +bool tox_group_mod_event_unpack(Tox_Group_Mod_Event *val, Bin_Unpack *bu) { uint32_t u32; return bin_unpack_u32(bu, &u32) @@ -337,7 +337,7 @@ static bool tox_group_exit_type_from_int(uint32_t value, Tox_Group_Exit_Type *ou } } } -bool tox_group_exit_type_unpack(Bin_Unpack *bu, Tox_Group_Exit_Type *val) +bool tox_group_exit_type_unpack(Tox_Group_Exit_Type *val, Bin_Unpack *bu) { uint32_t u32; return bin_unpack_u32(bu, &u32) diff --git a/toxcore/tox_unpack.h b/toxcore/tox_unpack.h index af134ca..1f2118c 100644 --- a/toxcore/tox_unpack.h +++ b/toxcore/tox_unpack.h @@ -9,16 +9,16 @@ #include "bin_unpack.h" #include "tox.h" -non_null() bool tox_conference_type_unpack(Bin_Unpack *bu, Tox_Conference_Type *val); -non_null() bool tox_connection_unpack(Bin_Unpack *bu, Tox_Connection *val); -non_null() bool tox_file_control_unpack(Bin_Unpack *bu, Tox_File_Control *val); -non_null() bool tox_message_type_unpack(Bin_Unpack *bu, Tox_Message_Type *val); -non_null() bool tox_user_status_unpack(Bin_Unpack *bu, Tox_User_Status *val); -non_null() bool tox_group_privacy_state_unpack(Bin_Unpack *bu, Tox_Group_Privacy_State *val); -non_null() bool tox_group_voice_state_unpack(Bin_Unpack *bu, Tox_Group_Voice_State *val); -non_null() bool tox_group_topic_lock_unpack(Bin_Unpack *bu, Tox_Group_Topic_Lock *val); -non_null() bool tox_group_join_fail_unpack(Bin_Unpack *bu, Tox_Group_Join_Fail *val); -non_null() bool tox_group_mod_event_unpack(Bin_Unpack *bu, Tox_Group_Mod_Event *val); -non_null() bool tox_group_exit_type_unpack(Bin_Unpack *bu, Tox_Group_Exit_Type *val); +non_null() bool tox_conference_type_unpack(Tox_Conference_Type *val, Bin_Unpack *bu); +non_null() bool tox_connection_unpack(Tox_Connection *val, Bin_Unpack *bu); +non_null() bool tox_file_control_unpack(Tox_File_Control *val, Bin_Unpack *bu); +non_null() bool tox_message_type_unpack(Tox_Message_Type *val, Bin_Unpack *bu); +non_null() bool tox_user_status_unpack(Tox_User_Status *val, Bin_Unpack *bu); +non_null() bool tox_group_privacy_state_unpack(Tox_Group_Privacy_State *val, Bin_Unpack *bu); +non_null() bool tox_group_voice_state_unpack(Tox_Group_Voice_State *val, Bin_Unpack *bu); +non_null() bool tox_group_topic_lock_unpack(Tox_Group_Topic_Lock *val, Bin_Unpack *bu); +non_null() bool tox_group_join_fail_unpack(Tox_Group_Join_Fail *val, Bin_Unpack *bu); +non_null() bool tox_group_mod_event_unpack(Tox_Group_Mod_Event *val, Bin_Unpack *bu); +non_null() bool tox_group_exit_type_unpack(Tox_Group_Exit_Type *val, Bin_Unpack *bu); #endif // C_TOXCORE_TOXCORE_TOX_UNPACK_H