diff --git a/external/tox_ngc_ft1/tox_ngc_ft1 b/external/tox_ngc_ft1/tox_ngc_ft1 index 27f4dd7..4c37f0c 160000 --- a/external/tox_ngc_ft1/tox_ngc_ft1 +++ b/external/tox_ngc_ft1/tox_ngc_ft1 @@ -1 +1 @@ -Subproject commit 27f4dd7180be0309aa201cdf2453197ce7acea32 +Subproject commit 4c37f0c32bd22f55756c5adacf37956a9b7dac1e diff --git a/src/tox_callbacks.cpp b/src/tox_callbacks.cpp index 86e4576..6ec94ac 100644 --- a/src/tox_callbacks.cpp +++ b/src/tox_callbacks.cpp @@ -5,6 +5,8 @@ #include #include +// TODO: maybe a dispatch table is better? + // logging void log_cb(Tox*, TOX_LOG_LEVEL level, const char *file, uint32_t line, const char *func, const char *message, void *user_data) { //ToxClient* client = static_cast(user_data); @@ -43,3 +45,39 @@ void group_self_join_cb(Tox*, uint32_t group_number, void *user_data) { static_cast(user_data)->onToxGroupSelfJoin(group_number); } +// ==================== sha1_info ==================== + +void ft1_recv_request_sha1_info_cb(Tox*, uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size, void* user_data) { + static_cast(user_data)->onFT1ReceiveRequestSHA1Info(group_number, peer_number, file_id, file_id_size); +} + +bool ft1_recv_init_sha1_info_cb(Tox*, uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size, const uint8_t transfer_id, const size_t file_size, void* user_data) { + return static_cast(user_data)->onFT1ReceiveInitSHA1Info(group_number, peer_number, file_id, file_id_size, transfer_id, file_size); +} + +void ft1_recv_data_sha1_info_cb(Tox*, uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, const uint8_t* data, size_t data_size, void* user_data) { + static_cast(user_data)->onFT1ReceiveDataSHA1Info(group_number, peer_number, transfer_id, data_offset, data, data_size); +} + +void ft1_send_data_sha1_info_cb(Tox*, uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, uint8_t* data, size_t data_size, void* user_data) { + static_cast(user_data)->onFT1SendDataSHA1Info(group_number, peer_number, transfer_id, data_offset, data, data_size); +} + +// ==================== sha1_chunk ==================== + +void ft1_recv_request_sha1_chunk_cb(Tox*, uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size, void* user_data) { + static_cast(user_data)->onFT1ReceiveRequestSHA1Chunk(group_number, peer_number, file_id, file_id_size); +} + +bool ft1_recv_init_sha1_chunk_cb(Tox*, uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size, const uint8_t transfer_id, const size_t file_size, void* user_data) { + return static_cast(user_data)->onFT1ReceiveInitSHA1Chunk(group_number, peer_number, file_id, file_id_size, transfer_id, file_size); +} + +void ft1_recv_data_sha1_chunk_cb(Tox*, uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, const uint8_t* data, size_t data_size, void* user_data) { + static_cast(user_data)->onFT1ReceiveDataSHA1Chunk(group_number, peer_number, transfer_id, data_offset, data, data_size); +} + +void ft1_send_data_sha1_chunk_cb(Tox*, uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, uint8_t* data, size_t data_size, void* user_data) { + static_cast(user_data)->onFT1SendDataSHA1Chunk(group_number, peer_number, transfer_id, data_offset, data, data_size); +} + diff --git a/src/tox_callbacks.hpp b/src/tox_callbacks.hpp index 93838b7..14563e2 100644 --- a/src/tox_callbacks.hpp +++ b/src/tox_callbacks.hpp @@ -38,3 +38,17 @@ void group_self_join_cb(Tox *tox, uint32_t group_number, void *user_data); //static void group_join_fail_cb(Tox *tox, uint32_t group_number, Tox_Group_Join_Fail fail_type, void *user_data); //static void group_moderation_cb(Tox *tox, uint32_t group_number, uint32_t source_peer_id, uint32_t target_peer_id, Tox_Group_Mod_Event mod_type, void *user_data); +// ft1 + +// sha1_info +void ft1_recv_request_sha1_info_cb(Tox *tox, uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size, void* user_data); +bool ft1_recv_init_sha1_info_cb(Tox *tox, uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size, const uint8_t transfer_id, const size_t file_size, void* user_data); +void ft1_recv_data_sha1_info_cb(Tox *tox, uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, const uint8_t* data, size_t data_size, void* user_data); +void ft1_send_data_sha1_info_cb(Tox *tox, uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, uint8_t* data, size_t data_size, void* user_data); + +// sha1_chunk +void ft1_recv_request_sha1_chunk_cb(Tox *tox, uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size, void* user_data); +bool ft1_recv_init_sha1_chunk_cb(Tox *tox, uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size, const uint8_t transfer_id, const size_t file_size, void* user_data); +void ft1_recv_data_sha1_chunk_cb(Tox *tox, uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, const uint8_t* data, size_t data_size, void* user_data); +void ft1_send_data_sha1_chunk_cb(Tox *tox, uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, uint8_t* data, size_t data_size, void* user_data); + diff --git a/src/tox_client.cpp b/src/tox_client.cpp index 58e6f95..c4bf33d 100644 --- a/src/tox_client.cpp +++ b/src/tox_client.cpp @@ -65,8 +65,8 @@ ToxClient::ToxClient(const CommandLine& cl) : throw std::runtime_error{"tox failed"}; } -#define CALLBACK_REG(x) tox_callback_##x(_tox, x##_cb) - CALLBACK_REG(self_connection_status); +#define TOX_CALLBACK_REG(x) tox_callback_##x(_tox, x##_cb) + TOX_CALLBACK_REG(self_connection_status); //CALLBACK_REG(friend_name); //CALLBACK_REG(friend_status_message); @@ -74,7 +74,7 @@ ToxClient::ToxClient(const CommandLine& cl) : //CALLBACK_REG(friend_connection_status); //CALLBACK_REG(friend_typing); //CALLBACK_REG(friend_read_receipt); - CALLBACK_REG(friend_request); + TOX_CALLBACK_REG(friend_request); //CALLBACK_REG(friend_message); //CALLBACK_REG(file_recv_control); @@ -92,10 +92,13 @@ ToxClient::ToxClient(const CommandLine& cl) : //CALLBACK_REG(friend_lossy_packet); //CALLBACK_REG(friend_lossless_packet); - CALLBACK_REG(group_custom_packet); - CALLBACK_REG(group_custom_private_packet); - CALLBACK_REG(group_invite); -#undef CALLBACK_REG + TOX_CALLBACK_REG(group_custom_packet); + TOX_CALLBACK_REG(group_custom_private_packet); + TOX_CALLBACK_REG(group_invite); + TOX_CALLBACK_REG(group_peer_join); + TOX_CALLBACK_REG(group_peer_exit); + TOX_CALLBACK_REG(group_self_join); +#undef TOX_CALLBACK_REG if (_self_name.empty()) { _self_name = "tox_ngc_ft1_tool"; @@ -108,6 +111,18 @@ ToxClient::ToxClient(const CommandLine& cl) : _ft1_ctx = NGC_FT1_new(&ft1_options); NGC_FT1_register_ext(_ft1_ctx, _ext_ctx); + // sha1_info + NGC_FT1_register_callback_recv_request(_ft1_ctx, NGC_FT1_file_kind::HASH_SHA1_INFO, ft1_recv_request_sha1_info_cb, this); + NGC_FT1_register_callback_recv_init(_ft1_ctx, NGC_FT1_file_kind::HASH_SHA1_INFO, ft1_recv_init_sha1_info_cb, this); + NGC_FT1_register_callback_recv_data(_ft1_ctx, NGC_FT1_file_kind::HASH_SHA1_INFO, ft1_recv_data_sha1_info_cb, this); + NGC_FT1_register_callback_send_data(_ft1_ctx, NGC_FT1_file_kind::HASH_SHA1_INFO, ft1_send_data_sha1_info_cb, this); + + // sha1_chunk + NGC_FT1_register_callback_recv_request(_ft1_ctx, NGC_FT1_file_kind::HASH_SHA1_CHUNK, ft1_recv_request_sha1_chunk_cb, this); + NGC_FT1_register_callback_recv_init(_ft1_ctx, NGC_FT1_file_kind::HASH_SHA1_CHUNK, ft1_recv_init_sha1_chunk_cb, this); + NGC_FT1_register_callback_recv_data(_ft1_ctx, NGC_FT1_file_kind::HASH_SHA1_CHUNK, ft1_recv_data_sha1_chunk_cb, this); + NGC_FT1_register_callback_send_data(_ft1_ctx, NGC_FT1_file_kind::HASH_SHA1_CHUNK, ft1_send_data_sha1_chunk_cb, this); + // dht bootstrap { struct DHT_node { @@ -215,6 +230,34 @@ void ToxClient::onToxGroupSelfJoin(uint32_t group_number) { _tox_profile_dirty = true; } +// sha1_info +void ToxClient::onFT1ReceiveRequestSHA1Info(uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size) { +} + +bool ToxClient::onFT1ReceiveInitSHA1Info(uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size, const uint8_t transfer_id, const size_t file_size) { + return false; // deny +} + +void ToxClient::onFT1ReceiveDataSHA1Info(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, const uint8_t* data, size_t data_size) { +} + +void ToxClient::onFT1SendDataSHA1Info(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, uint8_t* data, size_t data_size) { +} + +// sha1_chunk +void ToxClient::onFT1ReceiveRequestSHA1Chunk(uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size) { +} + +bool ToxClient::onFT1ReceiveInitSHA1Chunk(uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size, const uint8_t transfer_id, const size_t file_size) { + return false; // deny +} + +void ToxClient::onFT1ReceiveDataSHA1Chunk(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, const uint8_t* data, size_t data_size) { +} + +void ToxClient::onFT1SendDataSHA1Chunk(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, uint8_t* data, size_t data_size) { +} + void ToxClient::saveToxProfile(void) { if (_tox_profile_path.empty()) { return; diff --git a/src/tox_client.hpp b/src/tox_client.hpp index f4fac02..771a323 100644 --- a/src/tox_client.hpp +++ b/src/tox_client.hpp @@ -30,6 +30,19 @@ struct ToxClient { void onToxGroupPeerExit(uint32_t group_number, uint32_t peer_id, Tox_Group_Exit_Type exit_type, std::string_view name, std::string_view part_message); void onToxGroupSelfJoin(uint32_t group_number); + public: // FT1 callbacks + // sha1_info + void onFT1ReceiveRequestSHA1Info(uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size); + bool onFT1ReceiveInitSHA1Info(uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size, const uint8_t transfer_id, const size_t file_size); + void onFT1ReceiveDataSHA1Info(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, const uint8_t* data, size_t data_size); + void onFT1SendDataSHA1Info(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, uint8_t* data, size_t data_size); + + // sha1_chunk + void onFT1ReceiveRequestSHA1Chunk(uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size); + bool onFT1ReceiveInitSHA1Chunk(uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size, const uint8_t transfer_id, const size_t file_size); + void onFT1ReceiveDataSHA1Chunk(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, const uint8_t* data, size_t data_size); + void onFT1SendDataSHA1Chunk(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, uint8_t* data, size_t data_size); + private: void saveToxProfile(void);