From 0e9b1b88778f3b78e2319f1afbc1f90cb6f641d9 Mon Sep 17 00:00:00 2001 From: Green Sky Date: Wed, 10 Jul 2024 15:04:53 +0200 Subject: [PATCH] add ext have all packet --- solanaceae/ngc_ext/ngcext.cpp | 56 +++++++++++++++++++++++++++++++++-- solanaceae/ngc_ext/ngcext.hpp | 30 +++++++++++++++++++ 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/solanaceae/ngc_ext/ngcext.cpp b/solanaceae/ngc_ext/ngcext.cpp index a0ac4dd..cbe0aa2 100644 --- a/solanaceae/ngc_ext/ngcext.cpp +++ b/solanaceae/ngc_ext/ngcext.cpp @@ -291,7 +291,7 @@ bool NGCEXTEventProvider::parse_ft1_have( file_id_size |= uint32_t(data[curser]) << (i*8); } - _DATA_HAVE(file_id_size, std::cerr << "NGCEXT: packet too small, missing file_id, or file_id_size too large\n"; return false) + _DATA_HAVE(file_id_size, std::cerr << "NGCEXT: packet too small, missing file_id, or file_id_size too large(" << data_size-curser << ")\n"; return false) e.file_id = {data+curser, data+curser+file_id_size}; curser += file_id_size; @@ -343,7 +343,7 @@ bool NGCEXTEventProvider::parse_ft1_bitset( file_id_size |= uint32_t(data[curser]) << (i*8); } - _DATA_HAVE(file_id_size, std::cerr << "NGCEXT: packet too small, missing file_id, or file_id_size too large\n"; return false) + _DATA_HAVE(file_id_size, std::cerr << "NGCEXT: packet too small, missing file_id, or file_id_size too large (" << data_size-curser << ")\n"; return false) e.file_id = {data+curser, data+curser+file_id_size}; curser += file_id_size; @@ -368,6 +368,37 @@ bool NGCEXTEventProvider::parse_ft1_bitset( ); } +bool NGCEXTEventProvider::parse_ft1_have_all( + uint32_t group_number, uint32_t peer_number, + const uint8_t* data, size_t data_size, + bool _private +) { + // can be public + // TODO: warn on public? + + Events::NGCEXT_ft1_have_all e; + e.group_number = group_number; + e.peer_number = peer_number; + size_t curser = 0; + + // - 4 byte (file_kind) + e.file_kind = 0u; + _DATA_HAVE(sizeof(e.file_kind), std::cerr << "NGCEXT: packet too small, missing file_kind\n"; return false) + for (size_t i = 0; i < sizeof(e.file_kind); i++, curser++) { + e.file_kind |= uint32_t(data[curser]) << (i*8); + } + + _DATA_HAVE(1, std::cerr << "NGCEXT: packet too small, missing file_id\n"; return false) + + // - X bytes (file_id, differnt sizes) + e.file_id = {data+curser, data+curser+(data_size-curser)}; + + return dispatch( + NGCEXT_Event::FT1_HAVE_ALL, + e + ); +} + bool NGCEXTEventProvider::parse_pc1_announce( uint32_t group_number, uint32_t peer_number, const uint8_t* data, size_t data_size, @@ -423,6 +454,8 @@ bool NGCEXTEventProvider::handlePacket( return parse_ft1_have(group_number, peer_number, data+1, data_size-1, _private); case NGCEXT_Event::FT1_BITSET: return parse_ft1_bitset(group_number, peer_number, data+1, data_size-1, _private); + case NGCEXT_Event::FT1_HAVE_ALL: + return parse_ft1_have_all(group_number, peer_number, data+1, data_size-1, _private); case NGCEXT_Event::PC1_ANNOUNCE: return parse_pc1_announce(group_number, peer_number, data+1, data_size-1, _private); default: @@ -647,6 +680,25 @@ bool NGCEXTEventProvider::send_ft1_bitset( return _t.toxGroupSendCustomPrivatePacket(group_number, peer_number, true, pkg) == TOX_ERR_GROUP_SEND_CUSTOM_PRIVATE_PACKET_OK; } +bool NGCEXTEventProvider::send_ft1_have_all( + uint32_t group_number, uint32_t peer_number, + uint32_t file_kind, + const uint8_t* file_id, size_t file_id_size +) { + std::vector pkg; + pkg.push_back(static_cast(NGCEXT_Event::FT1_HAVE_ALL)); + + for (size_t i = 0; i < sizeof(file_kind); i++) { + pkg.push_back((file_kind>>(i*8)) & 0xff); + } + for (size_t i = 0; i < file_id_size; i++) { + pkg.push_back(file_id[i]); + } + + // lossless + return _t.toxGroupSendCustomPrivatePacket(group_number, peer_number, true, pkg) == TOX_ERR_GROUP_SEND_CUSTOM_PRIVATE_PACKET_OK; +} + static std::vector build_pc1_announce(const uint8_t* id_data, size_t id_size) { // - 1 byte packet id // - X bytes (id, differnt sizes) diff --git a/solanaceae/ngc_ext/ngcext.hpp b/solanaceae/ngc_ext/ngcext.hpp index fd4e020..df12c36 100644 --- a/solanaceae/ngc_ext/ngcext.hpp +++ b/solanaceae/ngc_ext/ngcext.hpp @@ -162,6 +162,17 @@ namespace Events { std::vector chunk_bitset; }; + struct NGCEXT_ft1_have_all { + uint32_t group_number; + uint32_t peer_number; + + // - 4 byte (file_kind) + uint32_t file_kind; + + // - X bytes (file_kind dependent id, differnt sizes) + std::vector file_id; + }; + struct NGCEXT_pc1_announce { uint32_t group_number; uint32_t peer_number; @@ -257,6 +268,12 @@ enum class NGCEXT_Event : uint8_t { // - ] (filled up with zero) FT1_BITSET, + // announce you have all chunks, for given info + // prefer over have and bitset + // - 4 bytes (file_kind) + // - X bytes (file_kind dependent id, differnt sizes) + FT1_HAVE_ALL, + // TODO: FT1_IDONTHAVE, tell a peer you no longer have said chunk // TODO: FT1_REJECT, tell a peer you wont fulfil the request @@ -282,6 +299,7 @@ struct NGCEXTEventI { virtual bool onEvent(const Events::NGCEXT_ft1_message&) { return false; } virtual bool onEvent(const Events::NGCEXT_ft1_have&) { return false; } virtual bool onEvent(const Events::NGCEXT_ft1_bitset&) { return false; } + virtual bool onEvent(const Events::NGCEXT_ft1_have_all&) { return false; } virtual bool onEvent(const Events::NGCEXT_pc1_announce&) { return false; } }; @@ -361,6 +379,12 @@ class NGCEXTEventProvider : public ToxEventI, public NGCEXTEventProviderI { bool _private ); + bool parse_ft1_have_all( + uint32_t group_number, uint32_t peer_number, + const uint8_t* data, size_t data_size, + bool _private + ); + bool parse_pc1_announce( uint32_t group_number, uint32_t peer_number, const uint8_t* data, size_t data_size, @@ -431,6 +455,12 @@ class NGCEXTEventProvider : public ToxEventI, public NGCEXTEventProviderI { const uint8_t* bitset_data, size_t bitset_size // size is bytes ); + bool send_ft1_have_all( + uint32_t group_number, uint32_t peer_number, + uint32_t file_kind, + const uint8_t* file_id, size_t file_id_size + ); + bool send_pc1_announce( uint32_t group_number, uint32_t peer_number, const uint8_t* id_data, size_t id_size