diff --git a/CMakeLists.txt b/CMakeLists.txt index 2bc9d32..1b5a949 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,6 +57,11 @@ add_library(solanaceae_sha1_ngcft1 ./solanaceae/ngc_ft1_sha1/components.hpp ./solanaceae/ngc_ft1_sha1/components.cpp + ./solanaceae/ngc_ft1_sha1/chunk_picker.hpp + + ./solanaceae/ngc_ft1_sha1/participation.hpp + ./solanaceae/ngc_ft1_sha1/participation.cpp + ./solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp ./solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp ) diff --git a/solanaceae/ngc_ft1_sha1/participation.cpp b/solanaceae/ngc_ft1_sha1/participation.cpp new file mode 100644 index 0000000..8cf6213 --- /dev/null +++ b/solanaceae/ngc_ft1_sha1/participation.cpp @@ -0,0 +1,34 @@ +#include "./participation.hpp" + +#include "./chunk_picker.hpp" + +bool addParticipation(Contact3Handle c, ObjectHandle o) { + bool was_new {false}; + + if (static_cast(o)) { + const auto [_, inserted] = o.get_or_emplace().participants.emplace(c); + was_new = inserted; + } + + if (static_cast(c)) { + const auto [_, inserted] = c.get_or_emplace().participating.emplace(o); + was_new = was_new || inserted; + + // TODO: if not have_all + c.get_or_emplace().participating_unfinished.emplace(o, ChunkPicker::ParticipationEntry{}); + } + + return was_new; +} + +void removeParticipation(Contact3Handle c, ObjectHandle o) { + if (static_cast(o) && o.all_of()) { + o.get().participants.erase(c); + } + + if (static_cast(c) && c.all_of()) { + c.get().participating.erase(o); + c.get().participating_unfinished.erase(o); + } +} + diff --git a/solanaceae/ngc_ft1_sha1/participation.hpp b/solanaceae/ngc_ft1_sha1/participation.hpp new file mode 100644 index 0000000..aa8fef9 --- /dev/null +++ b/solanaceae/ngc_ft1_sha1/participation.hpp @@ -0,0 +1,8 @@ +#pragma once + +#include +#include + +bool addParticipation(Contact3Handle c, ObjectHandle o); +void removeParticipation(Contact3Handle c, ObjectHandle o); + diff --git a/solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp b/solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp index da214ba..e3872f2 100644 --- a/solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp +++ b/solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp @@ -18,6 +18,7 @@ #include "./components.hpp" #include "./chunk_picker.hpp" +#include "./participation.hpp" #include #include @@ -114,36 +115,6 @@ void SHA1_NGCFT1::updateMessages(ObjectHandle ce) { } } -bool SHA1_NGCFT1::addParticipation(Contact3 c, ObjectHandle o) { - bool was_new {false}; - - if (static_cast(o)) { - const auto [_, inserted] = o.get_or_emplace().participants.emplace(c); - was_new = inserted; - } - - if (_cr.valid(c)) { - const auto [_, inserted] = _cr.get_or_emplace(c).participating.emplace(o); - was_new = was_new || inserted; - - // TODO: if not have_all - _cr.get_or_emplace(c).participating_unfinished.emplace(o, ChunkPicker::ParticipationEntry{}); - } - - return was_new; -} - -void SHA1_NGCFT1::removeParticipation(Contact3 c, ObjectHandle o) { - if (static_cast(o) && o.all_of()) { - o.get().participants.erase(c); - } - - if (_cr.valid(c) && _cr.all_of(c)) { - _cr.get(c).participating.erase(o); - _cr.get(c).participating_unfinished.erase(o); - } -} - std::optional> SHA1_NGCFT1::selectPeerForRequest(ObjectHandle ce) { // get a list of peers we can request this file from std::vector> tox_peers; @@ -1474,16 +1445,16 @@ bool SHA1_NGCFT1::onToxEvent(const Tox_Event_Group_Peer_Exit* e) { // peer disconnected // - remove from all participantions - auto ch = _tcm.getContactGroupPeer(group_number, peer_number); - if (!static_cast(ch)) { + auto c = _tcm.getContactGroupPeer(group_number, peer_number); + if (!static_cast(c)) { return false; } - for (const auto& [_, h] : _info_to_content) { - removeParticipation(ch, h); + for (const auto& [_, o] : _info_to_content) { + removeParticipation(c, o); - if (h.all_of()) { - h.get().others.erase(ch); + if (o.all_of()) { + o.get().others.erase(c); } } @@ -1515,21 +1486,21 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCEXT_ft1_have& e) { return false; } - auto ce = itc_it->second; + auto o = itc_it->second; - if (!static_cast(ce)) { + if (!static_cast(o)) { std::cerr << "SHA1_NGCFT1 error: tracking info has null object\n"; return false; } - const size_t num_total_chunks = ce.get().chunks.size(); + const size_t num_total_chunks = o.get().chunks.size(); const auto c = _tcm.getContactGroupPeer(e.group_number, e.peer_number); // we might not know yet - addParticipation(c, ce); + addParticipation(c, o); - auto& remote_have = ce.get_or_emplace().others; + auto& remote_have = o.get_or_emplace().others; if (!remote_have.contains(c)) { // init remote_have.emplace(c, Components::RemoteHave::Entry{false, num_total_chunks}); @@ -1589,14 +1560,14 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCEXT_ft1_bitset& e) { return false; } - auto ce = itc_it->second; + auto o = itc_it->second; - if (!static_cast(ce)) { + if (!static_cast(o)) { std::cerr << "SHA1_NGCFT1 error: tracking info has null object\n"; return false; } - const size_t num_total_chunks = ce.get().chunks.size(); + const size_t num_total_chunks = o.get().chunks.size(); // +1 for byte rounding if (num_total_chunks+1 < e.start_chunk + (e.chunk_bitset.size()*8)) { std::cerr << "SHA1_NGCFT1 error: got bitset.size+start that is larger then number of chunks!!\n"; @@ -1606,9 +1577,9 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCEXT_ft1_bitset& e) { const auto c = _tcm.getContactGroupPeer(e.group_number, e.peer_number); // we might not know yet - addParticipation(c, ce); + addParticipation(c, o); - auto& remote_have = ce.get_or_emplace().others; + auto& remote_have = o.get_or_emplace().others; if (!remote_have.contains(c)) { // init remote_have.emplace(c, Components::RemoteHave::Entry{false, num_total_chunks}); @@ -1670,9 +1641,9 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCEXT_pc1_announce& e) { } // add them to participants - auto ce = itc_it->second; const auto c = _tcm.getContactGroupPeer(e.group_number, e.peer_number); - const bool was_new = addParticipation(c, ce); + auto o = itc_it->second; + const bool was_new = addParticipation(c, o); if (was_new) { std::cout << "SHA1_NGCFT1: and we where interested!\n"; // we should probably send the bitset back here / add to queue (can be multiple packets) diff --git a/solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp b/solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp index 0fcf93e..8fa1038 100644 --- a/solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp +++ b/solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp @@ -108,9 +108,6 @@ class SHA1_NGCFT1 : public ToxEventI, public RegistryMessageModelEventI, public void updateMessages(ObjectHandle ce); - bool addParticipation(Contact3 c, ObjectHandle o); - void removeParticipation(Contact3 c, ObjectHandle o); - std::optional> selectPeerForRequest(ObjectHandle ce); public: // TODO: config