From dacda2439069a0181c0f15d1fb2faf0262b29814 Mon Sep 17 00:00:00 2001 From: Green Sky Date: Mon, 10 Mar 2025 15:09:45 +0100 Subject: [PATCH] port to contact4 (not using events yet) --- plugins/plugin_ngcft1.cpp | 4 +- plugins/plugin_ngchs2.cpp | 6 +- solanaceae/ngc_ft1_sha1/chunk_picker.cpp | 4 +- solanaceae/ngc_ft1_sha1/chunk_picker.hpp | 6 +- .../ngc_ft1_sha1/chunk_picker_systems.cpp | 20 +++--- .../ngc_ft1_sha1/chunk_picker_systems.hpp | 6 +- solanaceae/ngc_ft1_sha1/components.hpp | 10 +-- solanaceae/ngc_ft1_sha1/participation.cpp | 4 +- solanaceae/ngc_ft1_sha1/participation.hpp | 6 +- .../ngc_ft1_sha1/re_announce_systems.cpp | 5 +- .../ngc_ft1_sha1/re_announce_systems.hpp | 4 +- solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp | 68 +++++++++++-------- solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp | 18 ++--- .../ngc_ft1_sha1/transfer_stats_systems.cpp | 2 +- solanaceae/ngc_hs2/ngc_hs2_rizzler.cpp | 41 +++++------ solanaceae/ngc_hs2/ngc_hs2_rizzler.hpp | 12 ++-- solanaceae/ngc_hs2/ngc_hs2_sigma.cpp | 27 ++++---- solanaceae/ngc_hs2/ngc_hs2_sigma.hpp | 12 ++-- 18 files changed, 133 insertions(+), 122 deletions(-) diff --git a/plugins/plugin_ngcft1.cpp b/plugins/plugin_ngcft1.cpp index 4d1446c..cb0cffe 100644 --- a/plugins/plugin_ngcft1.cpp +++ b/plugins/plugin_ngcft1.cpp @@ -38,7 +38,7 @@ SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_start(struct SolanaAPI* solana_api) auto* os = PLUG_RESOLVE_INSTANCE(ObjectStore2); auto* tox_i = PLUG_RESOLVE_INSTANCE(ToxI); auto* tox_event_provider_i = PLUG_RESOLVE_INSTANCE(ToxEventProviderI); - auto* cr = PLUG_RESOLVE_INSTANCE_VERSIONED(Contact3Registry, "1"); + auto* cs = PLUG_RESOLVE_INSTANCE(ContactStore4I); auto* rmm = PLUG_RESOLVE_INSTANCE(RegistryMessageModelI); auto* tcm = PLUG_RESOLVE_INSTANCE(ToxContactModel2); @@ -46,7 +46,7 @@ SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_start(struct SolanaAPI* solana_api) // construct with fetched dependencies g_ngcextep = std::make_unique(*tox_i, *tox_event_provider_i); g_ngcft1 = std::make_unique(*tox_i, *tox_event_provider_i, *g_ngcextep.get()); - g_sha1_ngcft1 = std::make_unique(*os, *cr, *rmm, *g_ngcft1.get(), *tcm, *tox_event_provider_i, *g_ngcextep.get()); + g_sha1_ngcft1 = std::make_unique(*os, *cs, *rmm, *g_ngcft1.get(), *tcm, *tox_event_provider_i, *g_ngcextep.get()); // register types PLUG_PROVIDE_INSTANCE(NGCEXTEventProviderI, plugin_name, g_ngcextep.get()); diff --git a/plugins/plugin_ngchs2.cpp b/plugins/plugin_ngchs2.cpp index ce93919..df31967 100644 --- a/plugins/plugin_ngchs2.cpp +++ b/plugins/plugin_ngchs2.cpp @@ -40,7 +40,7 @@ SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_start(struct SolanaAPI* solana_api) try { //auto* tox_i = PLUG_RESOLVE_INSTANCE(ToxI); auto* tox_event_provider_i = PLUG_RESOLVE_INSTANCE(ToxEventProviderI); - auto* cr = PLUG_RESOLVE_INSTANCE_VERSIONED(Contact3Registry, "1"); + auto* cs = PLUG_RESOLVE_INSTANCE(ContactStore4I); auto* rmm = PLUG_RESOLVE_INSTANCE(RegistryMessageModelI); auto* tcm = PLUG_RESOLVE_INSTANCE(ToxContactModel2); auto* ngcft1 = PLUG_RESOLVE_INSTANCE(NGCFT1); @@ -48,8 +48,8 @@ SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_start(struct SolanaAPI* solana_api) // static store, could be anywhere tho // construct with fetched dependencies - g_ngchs2s = std::make_unique(*cr, *rmm, *tcm, *ngcft1); - g_ngchs2r = std::make_unique(*cr, *rmm, *tcm, *ngcft1, *tox_event_provider_i, *sha1_ngcft1); + g_ngchs2s = std::make_unique(*cs, *rmm, *tcm, *ngcft1); + g_ngchs2r = std::make_unique(*cs, *rmm, *tcm, *ngcft1, *tox_event_provider_i, *sha1_ngcft1); // register types PLUG_PROVIDE_INSTANCE(NGCHS2Sigma, plugin_name, g_ngchs2s.get()); diff --git a/solanaceae/ngc_ft1_sha1/chunk_picker.cpp b/solanaceae/ngc_ft1_sha1/chunk_picker.cpp index c308174..68edca8 100644 --- a/solanaceae/ngc_ft1_sha1/chunk_picker.cpp +++ b/solanaceae/ngc_ft1_sha1/chunk_picker.cpp @@ -123,7 +123,7 @@ static constexpr size_t flowWindowToRequestCount(size_t flow_window) { } void ChunkPicker::updateParticipation( - Contact3Handle c, + ContactHandle4 c, ObjectRegistry& objreg ) { if (!c.all_of()) { @@ -211,7 +211,7 @@ void ChunkPicker::updateParticipation( } std::vector ChunkPicker::updateChunkRequests( - Contact3Handle c, + ContactHandle4 c, ObjectRegistry& objreg, const ReceivingTransfers& rt, const size_t open_requests diff --git a/solanaceae/ngc_ft1_sha1/chunk_picker.hpp b/solanaceae/ngc_ft1_sha1/chunk_picker.hpp index d0d026c..7a207f7 100644 --- a/solanaceae/ngc_ft1_sha1/chunk_picker.hpp +++ b/solanaceae/ngc_ft1_sha1/chunk_picker.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include "./components.hpp" @@ -50,7 +50,7 @@ struct ChunkPicker { private: // TODO: properly sort // updates participating_unfinished void updateParticipation( - Contact3Handle c, + ContactHandle4 c, ObjectRegistry& objreg ); public: @@ -66,7 +66,7 @@ struct ChunkPicker { }; // returns list of chunks to request [[nodiscard]] std::vector updateChunkRequests( - Contact3Handle c, + ContactHandle4 c, ObjectRegistry& objreg, const ReceivingTransfers& rt, const size_t open_requests diff --git a/solanaceae/ngc_ft1_sha1/chunk_picker_systems.cpp b/solanaceae/ngc_ft1_sha1/chunk_picker_systems.cpp index f5ce30e..6bd341b 100644 --- a/solanaceae/ngc_ft1_sha1/chunk_picker_systems.cpp +++ b/solanaceae/ngc_ft1_sha1/chunk_picker_systems.cpp @@ -1,5 +1,7 @@ #include "./chunk_picker_systems.hpp" +#include + #include #include "./components.hpp" @@ -12,17 +14,19 @@ namespace Systems { void chunk_picker_updates( - Contact3Registry& cr, + ContactStore4I& cs, ObjectRegistry& os_reg, - const entt::dense_map& peer_open_requests, + const entt::dense_map& peer_open_requests, const ReceivingTransfers& receiving_transfers, NGCFT1& nft, // TODO: remove this somehow const float delta ) { - std::vector cp_to_remove; + std::vector cp_to_remove; + + auto& cr = cs.registry(); // first, update timers - cr.view().each([&cr, delta](const Contact3 cv, ChunkPickerTimer& cpt) { + cr.view().each([&cr, delta](const Contact4 cv, ChunkPickerTimer& cpt) { cpt.timer -= delta; if (cpt.timer <= 0.f) { cr.emplace_or_replace(cv); @@ -33,8 +37,8 @@ void chunk_picker_updates( // now check for potentially missing cp auto cput_view = cr.view(); - cput_view.each([&cr, &cp_to_remove](const Contact3 cv) { - Contact3Handle c{cr, cv}; + cput_view.each([&cr, &cp_to_remove](const Contact4 cv) { + ContactHandle4 c{cr, cv}; //std::cout << "cput :)\n"; @@ -52,8 +56,8 @@ void chunk_picker_updates( }); // now update all cp that are tagged - cr.view().each([&cr, &os_reg, &peer_open_requests, &receiving_transfers, &nft, &cp_to_remove](const Contact3 cv, ChunkPicker& cp) { - Contact3Handle c{cr, cv}; + cr.view().each([&cr, &os_reg, &peer_open_requests, &receiving_transfers, &nft, &cp_to_remove](const Contact4 cv, ChunkPicker& cp) { + ContactHandle4 c{cr, cv}; if (!c.all_of()) { cp_to_remove.push_back(c); diff --git a/solanaceae/ngc_ft1_sha1/chunk_picker_systems.hpp b/solanaceae/ngc_ft1_sha1/chunk_picker_systems.hpp index 2da7897..132d137 100644 --- a/solanaceae/ngc_ft1_sha1/chunk_picker_systems.hpp +++ b/solanaceae/ngc_ft1_sha1/chunk_picker_systems.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include #include @@ -10,9 +10,9 @@ namespace Systems { void chunk_picker_updates( - Contact3Registry& cr, + ContactStore4I& cs, ObjectRegistry& os_reg, - const entt::dense_map& peer_open_requests, + const entt::dense_map& peer_open_requests, const ReceivingTransfers& receiving_transfers, NGCFT1& nft, // TODO: remove this somehow const float delta diff --git a/solanaceae/ngc_ft1_sha1/components.hpp b/solanaceae/ngc_ft1_sha1/components.hpp index a44932e..2850be0 100644 --- a/solanaceae/ngc_ft1_sha1/components.hpp +++ b/solanaceae/ngc_ft1_sha1/components.hpp @@ -60,14 +60,14 @@ namespace Components { // requested chunks with a timer since last request struct Entry { float timer {0.f}; - Contact3 c {entt::null}; + Contact4 c {entt::null}; }; entt::dense_map chunks; }; // TODO: once announce is shipped, remove the "Suspected" struct SuspectedParticipants { - entt::dense_set participants; + entt::dense_set participants; }; struct ReRequestInfoTimer { @@ -75,7 +75,7 @@ namespace Components { }; struct AnnounceTargets { - entt::dense_set targets; + entt::dense_set targets; }; struct ReAnnounceTimer { @@ -92,7 +92,7 @@ namespace Components { }; struct TransferStatsSeparated { - entt::dense_map stats; + entt::dense_map stats; }; // used to populate stats @@ -111,7 +111,7 @@ namespace Components { void trimSent(const float time_now); void trimReceived(const float time_now); }; - entt::dense_map tally; + entt::dense_map tally; }; } // Components diff --git a/solanaceae/ngc_ft1_sha1/participation.cpp b/solanaceae/ngc_ft1_sha1/participation.cpp index c9655c9..35dae66 100644 --- a/solanaceae/ngc_ft1_sha1/participation.cpp +++ b/solanaceae/ngc_ft1_sha1/participation.cpp @@ -5,7 +5,7 @@ #include -bool addParticipation(Contact3Handle c, ObjectHandle o) { +bool addParticipation(ContactHandle4 c, ObjectHandle o) { bool was_new {false}; assert(static_cast(o)); assert(static_cast(c)); @@ -25,7 +25,7 @@ bool addParticipation(Contact3Handle c, ObjectHandle o) { return was_new; } -void removeParticipation(Contact3Handle c, ObjectHandle o) { +void removeParticipation(ContactHandle4 c, ObjectHandle o) { assert(static_cast(o)); assert(static_cast(c)); diff --git a/solanaceae/ngc_ft1_sha1/participation.hpp b/solanaceae/ngc_ft1_sha1/participation.hpp index aa8fef9..89cd87a 100644 --- a/solanaceae/ngc_ft1_sha1/participation.hpp +++ b/solanaceae/ngc_ft1_sha1/participation.hpp @@ -1,8 +1,8 @@ #pragma once #include -#include +#include -bool addParticipation(Contact3Handle c, ObjectHandle o); -void removeParticipation(Contact3Handle c, ObjectHandle o); +bool addParticipation(ContactHandle4 c, ObjectHandle o); +void removeParticipation(ContactHandle4 c, ObjectHandle o); diff --git a/solanaceae/ngc_ft1_sha1/re_announce_systems.cpp b/solanaceae/ngc_ft1_sha1/re_announce_systems.cpp index e4095fa..a5a69e2 100644 --- a/solanaceae/ngc_ft1_sha1/re_announce_systems.cpp +++ b/solanaceae/ngc_ft1_sha1/re_announce_systems.cpp @@ -2,6 +2,7 @@ #include "./components.hpp" #include +#include #include #include #include @@ -11,12 +12,12 @@ namespace Systems { void re_announce( ObjectRegistry& os_reg, - Contact3Registry& cr, + ContactStore4I& cs, NGCEXTEventProvider& neep, const float delta ) { std::vector to_remove; - os_reg.view().each([&os_reg, &cr, &neep, &to_remove, delta](Object ov, Components::ReAnnounceTimer& rat) { + os_reg.view().each([&os_reg, &cr = cs.registry(), &neep, &to_remove, delta](Object ov, Components::ReAnnounceTimer& rat) { ObjectHandle o{os_reg, ov}; // if no known targets, or no hash, remove if (!o.all_of()) { diff --git a/solanaceae/ngc_ft1_sha1/re_announce_systems.hpp b/solanaceae/ngc_ft1_sha1/re_announce_systems.hpp index 46847f3..8a87b87 100644 --- a/solanaceae/ngc_ft1_sha1/re_announce_systems.hpp +++ b/solanaceae/ngc_ft1_sha1/re_announce_systems.hpp @@ -1,14 +1,14 @@ #pragma once #include -#include +#include #include namespace Systems { void re_announce( ObjectRegistry& os_reg, - Contact3Registry& cr, + ContactStore4I& cs, NGCEXTEventProvider& neep, const float delta ); diff --git a/solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp b/solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp index 8000862..4fc22cd 100644 --- a/solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp +++ b/solanaceae/ngc_ft1_sha1/sha1_ngcft1.cpp @@ -3,6 +3,8 @@ #include #include +#include + #include #include #include @@ -90,6 +92,8 @@ std::optional> SHA1_NGCFT1::selectPeerForRequest(O // get a list of peers we can request this file from std::vector> tox_peers; + const auto& cr = _cs.registry(); + // 1 in 20 chance to ask random peer instead // also works well for empty SuspectedParticipants if ((_rng()%20) == 0) { @@ -102,17 +106,17 @@ std::optional> SHA1_NGCFT1::selectPeerForRequest(O } for (const auto& target : ce.get().targets) { - for (const auto child : _cr.get(target).subs) { - if (const auto* cs = _cr.try_get(child); cs == nullptr || cs->state == Contact::Components::ConnectionState::State::disconnected) { + for (const auto child : cr.get(target).subs) { + if (const auto* cs = cr.try_get(child); cs == nullptr || cs->state == Contact::Components::ConnectionState::State::disconnected) { continue; } - if (_cr.all_of(child)) { + if (cr.all_of(child)) { continue; // skip self } - if (_cr.all_of(child)) { - const auto& tgpe = _cr.get(child); + if (cr.all_of(child)) { + const auto& tgpe = cr.get(child); tox_peers.push_back({tgpe.group_number, tgpe.peer_number}); } } @@ -122,17 +126,17 @@ std::optional> SHA1_NGCFT1::selectPeerForRequest(O for (const auto c : ce.get().participants) { // TODO: sort by con state? // prio to direct? - if (const auto* cs = _cr.try_get(c); cs == nullptr || cs->state == Contact::Components::ConnectionState::State::disconnected) { + if (const auto* cs = cr.try_get(c); cs == nullptr || cs->state == Contact::Components::ConnectionState::State::disconnected) { continue; } - if (_cr.all_of(c)) { + if (cr.all_of(c)) { // FIXME: how did we select ourselfs to be a suspected participant continue; } - if (_cr.all_of(c)) { - const auto& tgpe = _cr.get(c); + if (cr.all_of(c)) { + const auto& tgpe = cr.get(c); tox_peers.push_back({tgpe.group_number, tgpe.peer_number}); } } @@ -148,7 +152,7 @@ std::optional> SHA1_NGCFT1::selectPeerForRequest(O return std::make_pair(group_number, peer_number); } -void SHA1_NGCFT1::queueBitsetSendFull(Contact3Handle c, ObjectHandle o) { +void SHA1_NGCFT1::queueBitsetSendFull(ContactHandle4 c, ObjectHandle o) { if (!static_cast(c) || !static_cast(o)) { assert(false); return; @@ -201,7 +205,7 @@ File2I* SHA1_NGCFT1::objGetFile2Read(ObjectHandle o) { SHA1_NGCFT1::SHA1_NGCFT1( ObjectStore2& os, - Contact3Registry& cr, + ContactStore4I& cs, RegistryMessageModelI& rmm, NGCFT1& nft, ToxContactModel2& tcm, @@ -210,7 +214,7 @@ SHA1_NGCFT1::SHA1_NGCFT1( ) : _os(os), _os_sr(_os.newSubRef(this)), - _cr(cr), + _cs(cs), _rmm(rmm), _rmm_sr(_rmm.newSubRef(this)), _nft(nft), @@ -321,7 +325,7 @@ float SHA1_NGCFT1::iterate(float delta) { } } - Systems::re_announce(_os.registry(), _cr, _neep, delta); + Systems::re_announce(_os.registry(), _cs, _neep, delta); { // send out bitsets // currently 1 per tick @@ -455,7 +459,7 @@ float SHA1_NGCFT1::iterate(float delta) { // new chunk picker code // TODO: need to either split up or remove some things here Systems::chunk_picker_updates( - _cr, + _cs, _os.registry(), _peer_open_requests, _receiving_transfers, @@ -476,7 +480,7 @@ float SHA1_NGCFT1::iterate(float delta) { } // gets called back on main thread after a "new" file info got built on a different thread -void SHA1_NGCFT1::onSendFileHashFinished(ObjectHandle o, Message3Registry* reg_ptr, Contact3 c, uint64_t ts) { +void SHA1_NGCFT1::onSendFileHashFinished(ObjectHandle o, Message3Registry* reg_ptr, Contact4 c, uint64_t ts) { // sanity if (!o.all_of()) { assert(false); @@ -505,7 +509,7 @@ void SHA1_NGCFT1::onSendFileHashFinished(ObjectHandle o, Message3Registry* reg_p // something happend, update all chunk pickers if (o.all_of()) { for (const auto& pcv : o.get().participants) { - Contact3Handle pch{_cr, pcv}; + ContactHandle4 pch = _cs.contactHandle(pcv); assert(static_cast(pch)); pch.emplace_or_replace(); } @@ -514,9 +518,11 @@ void SHA1_NGCFT1::onSendFileHashFinished(ObjectHandle o, Message3Registry* reg_p // in both cases, private and public, c (contact to) is the target o.get_or_emplace().targets.emplace(c); + const auto& cr = _cs.registry(); + // create message - const auto c_self = _cr.get(c).self; - if (!_cr.valid(c_self)) { + const auto c_self = cr.get(c).self; + if (!cr.valid(c_self)) { std::cerr << "SHA1_NGCFT1 error: failed to get self!\n"; return; } @@ -537,8 +543,8 @@ void SHA1_NGCFT1::onSendFileHashFinished(ObjectHandle o, Message3Registry* reg_p // file id would be sha1_info hash or something //reg_ptr->emplace(e, file_id); - if (_cr.any_of(c)) { - const uint32_t group_number = _cr.get(c).group_number; + if (cr.any_of(c)) { + const uint32_t group_number = cr.get(c).group_number; uint32_t message_id = 0; // TODO: check return @@ -546,7 +552,7 @@ void SHA1_NGCFT1::onSendFileHashFinished(ObjectHandle o, Message3Registry* reg_p reg_ptr->emplace(msg_e, message_id); } else if ( // non online group - _cr.any_of(c) + cr.any_of(c) ) { // create msg_id const uint32_t message_id = randombytes_random(); @@ -584,8 +590,8 @@ ObjectHandle SHA1_NGCFT1::constructFileMessageInPlace(Message3Handle msg, NGCFT1 msg.emplace_or_replace(o); // TODO: use to_c instead? - if (const auto* from_c_comp = msg.try_get(); from_c_comp != nullptr && _cr.valid(from_c_comp->c)) { - Contact3Handle c{_cr, from_c_comp->c}; + if (const auto* from_c_comp = msg.try_get(); from_c_comp != nullptr && _cs.registry().valid(from_c_comp->c)) { + ContactHandle4 c = _cs.contactHandle(from_c_comp->c); // TODO: check if public // since public @@ -747,7 +753,7 @@ bool SHA1_NGCFT1::onEvent(const ObjectStore::Events::ObjectUpdate& e) { if (e.e.all_of()) { std::cout << "SHA1_NGCFT1: accepted ft has " << e.e.get().participants.size() << " sp\n"; for (const auto cv : e.e.get().participants) { - _cr.emplace_or_replace(cv); + _cs.registry().emplace_or_replace(cv); } } else { std::cout << "accepted ft has NO sp!\n"; @@ -990,7 +996,7 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_data& e) { } } - Contact3Handle c; + ContactHandle4 c; const auto tpcc_it = _tox_peer_to_contact.find(combine_ids(e.group_number, e.peer_number)); if (tpcc_it != _tox_peer_to_contact.cend()) { c = tpcc_it->second; @@ -1057,7 +1063,7 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_send_data& e) { // TODO: add event to propergate to messages //_rmm.throwEventUpdate(transfer); // should we? - Contact3Handle c; + ContactHandle4 c; const auto tpcc_it = _tox_peer_to_contact.find(combine_ids(e.group_number, e.peer_number)); if (tpcc_it != _tox_peer_to_contact.cend()) { c = tpcc_it->second; @@ -1202,14 +1208,16 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_done& e) { o.remove(); // save space } + const auto& cr = _cs.registry(); + // queue chunk have for all participants // HACK: send immediatly to all participants for (const auto c_part : o.get().participants) { - if (!_cr.all_of(c_part)) { + if (!cr.all_of(c_part)) { continue; } - const auto [part_group_number, part_peer_number] = _cr.get(c_part); + const auto [part_group_number, part_peer_number] = cr.get(c_part); const auto& info_hash = o.get().hash; @@ -1350,10 +1358,10 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_message& e) { return true; // false? } -bool SHA1_NGCFT1::sendFilePath(const Contact3 c, std::string_view file_name, std::string_view file_path) { +bool SHA1_NGCFT1::sendFilePath(const Contact4 c, std::string_view file_name, std::string_view file_path) { if ( // TODO: add support of offline queuing - !_cr.all_of(c) + !_cs.registry().all_of(c) ) { return false; } diff --git a/solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp b/solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp index 2897e99..9d90027 100644 --- a/solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp +++ b/solanaceae/ngc_ft1_sha1/sha1_ngcft1.hpp @@ -3,7 +3,7 @@ // solanaceae port of sha1 fts for NGCFT1 #include -#include +#include #include #include @@ -24,7 +24,7 @@ class SHA1_NGCFT1 : public ToxEventI, public RegistryMessageModelEventI, public ObjectStore2& _os; ObjectStore2::SubscriptionReference _os_sr; // TODO: backend abstraction - Contact3Registry& _cr; + ContactStore4I& _cs; RegistryMessageModelI& _rmm; RegistryMessageModelI::SubscriptionReference _rmm_sr; NGCFT1& _nft; @@ -67,23 +67,23 @@ class SHA1_NGCFT1 : public ToxEventI, public RegistryMessageModelEventI, public std::deque _queue_content_want_info; struct QBitsetEntry { - Contact3Handle c; + ContactHandle4 c; ObjectHandle o; }; std::deque _queue_send_bitset; // FIXME: workaround missing contact events // only used on peer exit (no, also used to quicken lookups) - entt::dense_map _tox_peer_to_contact; + entt::dense_map _tox_peer_to_contact; // reset every iterate; kept here as an allocation optimization - entt::dense_map _peer_open_requests; + entt::dense_map _peer_open_requests; void updateMessages(ObjectHandle ce); std::optional> selectPeerForRequest(ObjectHandle ce); - void queueBitsetSendFull(Contact3Handle c, ObjectHandle o); + void queueBitsetSendFull(ContactHandle4 c, ObjectHandle o); File2I* objGetFile2Write(ObjectHandle o); File2I* objGetFile2Read(ObjectHandle o); @@ -97,7 +97,7 @@ class SHA1_NGCFT1 : public ToxEventI, public RegistryMessageModelEventI, public public: SHA1_NGCFT1( ObjectStore2& os, - Contact3Registry& cr, + ContactStore4I& cs, RegistryMessageModelI& rmm, NGCFT1& nft, ToxContactModel2& tcm, @@ -107,13 +107,13 @@ class SHA1_NGCFT1 : public ToxEventI, public RegistryMessageModelEventI, public float iterate(float delta); - void onSendFileHashFinished(ObjectHandle o, Message3Registry* reg_ptr, Contact3 c, uint64_t ts); + void onSendFileHashFinished(ObjectHandle o, Message3Registry* reg_ptr, Contact4 c, uint64_t ts); // construct the file part in a partially constructed message ObjectHandle constructFileMessageInPlace(Message3Handle msg, NGCFT1_file_kind file_kind, ByteSpan file_id); protected: // rmm events (actions) - bool sendFilePath(const Contact3 c, std::string_view file_name, std::string_view file_path) override; + bool sendFilePath(const Contact4 c, std::string_view file_name, std::string_view file_path) override; protected: // os events (actions) bool onEvent(const ObjectStore::Events::ObjectUpdate&) override; diff --git a/solanaceae/ngc_ft1_sha1/transfer_stats_systems.cpp b/solanaceae/ngc_ft1_sha1/transfer_stats_systems.cpp index 7b2c8bb..6fb0b61 100644 --- a/solanaceae/ngc_ft1_sha1/transfer_stats_systems.cpp +++ b/solanaceae/ngc_ft1_sha1/transfer_stats_systems.cpp @@ -12,7 +12,7 @@ void transfer_tally_update(ObjectRegistry& os_reg, const float time_now) { // for each tally -> stats separated os_reg.view().each([&os_reg, time_now, &tally_to_remove](const auto ov, Components::TransferStatsTally& tally_comp) { // for each peer - std::vector to_remove; + std::vector to_remove; for (auto&& [peer_c, peer] : tally_comp.tally) { auto& tss = os_reg.get_or_emplace(ov).stats; diff --git a/solanaceae/ngc_hs2/ngc_hs2_rizzler.cpp b/solanaceae/ngc_hs2/ngc_hs2_rizzler.cpp index 421d821..e911477 100644 --- a/solanaceae/ngc_hs2/ngc_hs2_rizzler.cpp +++ b/solanaceae/ngc_hs2/ngc_hs2_rizzler.cpp @@ -1,5 +1,6 @@ #include "./ngc_hs2_rizzler.hpp" +#include #include #include #include @@ -67,27 +68,15 @@ namespace Components { } // Components -// TODO: move to contact reg? -static Contact3 findContactByID(Contact3Registry& cr, const std::vector& id) { - // TODO: id lookup table, this is very inefficent - for (const auto& [c_it, id_it] : cr.view().each()) { - if (id == id_it.data) { - return c_it; - } - } - - return entt::null; -} - NGCHS2Rizzler::NGCHS2Rizzler( - Contact3Registry& cr, + ContactStore4I& cs, RegistryMessageModelI& rmm, ToxContactModel2& tcm, NGCFT1& nft, ToxEventProviderI& tep, SHA1_NGCFT1& sha1_nft ) : - _cr(cr), + _cs(cs), _rmm(rmm), _tcm(tcm), _nft(nft), @@ -117,7 +106,7 @@ float NGCHS2Rizzler::iterate(float delta) { continue; } - const Contact3Handle c {_cr, it->first}; + const ContactHandle4 c = _cs.contactHandle(it->first); if (!c.all_of()) { // peer nolonger online @@ -184,7 +173,7 @@ bool NGCHS2Rizzler::sendRequest( ); } -void NGCHS2Rizzler::handleMsgPack(Contact3Handle sync_by_c, const std::vector& data) { +void NGCHS2Rizzler::handleMsgPack(ContactHandle4 sync_by_c, const std::vector& data) { assert(sync_by_c); auto* reg_ptr = _rmm.get(sync_by_c); @@ -227,7 +216,7 @@ void NGCHS2Rizzler::handleMsgPack(Contact3Handle sync_by_c, const std::vector id; if (j_ppk.is_binary()) { @@ -236,15 +225,21 @@ void NGCHS2Rizzler::handleMsgPack(Contact3Handle sync_by_c, const std::vector().parent; - if (!_cr.valid(from_c)) { + from_c = _cs.getOneContactByID(parent, ByteSpan{id}); + + auto& cr = _cs.registry(); + + if (!cr.valid(from_c)) { // create sparse contact with id only - from_c = _cr.create(); - _cr.emplace_or_replace(from_c, id); + from_c = cr.create(); + cr.emplace_or_replace(from_c, id); // TODO: only if public message - _cr.emplace_or_replace(from_c, sync_by_c.get().parent); + cr.emplace_or_replace(from_c, parent); + + _cs.throwEventConstruct(from_c); } } @@ -319,7 +314,7 @@ void NGCHS2Rizzler::handleMsgPack(Contact3Handle sync_by_c, const std::vector()}; + const ContactHandle4 reg_c = _cs.contactHandle(reg.ctx().get()); if (reg_c.all_of()) { auto& comp = reg_c.get().comp; // walking EVERY existing message OOF diff --git a/solanaceae/ngc_hs2/ngc_hs2_rizzler.hpp b/solanaceae/ngc_hs2/ngc_hs2_rizzler.hpp index 8d63b9d..973dd9e 100644 --- a/solanaceae/ngc_hs2/ngc_hs2_rizzler.hpp +++ b/solanaceae/ngc_hs2/ngc_hs2_rizzler.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include @@ -12,7 +12,7 @@ class RegistryMessageModelI; class NGCHS2Rizzler : public ToxEventI, public NGCFT1EventI { - Contact3Registry& _cr; + ContactStore4I& _cs; RegistryMessageModelI& _rmm; ToxContactModel2& _tcm; NGCFT1& _nft; @@ -34,15 +34,15 @@ class NGCHS2Rizzler : public ToxEventI, public NGCFT1EventI { }; // request queue // c -> delay, timer - std::map _request_queue; + std::map _request_queue; // FIXME: workaround missing contact events // only used on peer exit (no, also used to quicken lookups) - entt::dense_map _tox_peer_to_contact; + entt::dense_map _tox_peer_to_contact; public: NGCHS2Rizzler( - Contact3Registry& cr, + ContactStore4I& cs, RegistryMessageModelI& rmm, ToxContactModel2& tcm, NGCFT1& nft, @@ -60,7 +60,7 @@ class NGCHS2Rizzler : public ToxEventI, public NGCFT1EventI { uint64_t ts_start, uint64_t ts_end ); - void handleMsgPack(Contact3Handle c, const std::vector& data); + void handleMsgPack(ContactHandle4 c, const std::vector& data); protected: bool onEvent(const Events::NGCFT1_recv_init&) override; diff --git a/solanaceae/ngc_hs2/ngc_hs2_sigma.cpp b/solanaceae/ngc_hs2/ngc_hs2_sigma.cpp index bf29c49..2a03012 100644 --- a/solanaceae/ngc_hs2/ngc_hs2_sigma.cpp +++ b/solanaceae/ngc_hs2/ngc_hs2_sigma.cpp @@ -2,6 +2,7 @@ #include +#include #include #include @@ -71,12 +72,12 @@ namespace Components { NGCHS2Sigma::NGCHS2Sigma( - Contact3Registry& cr, + ContactStore4I& cs, RegistryMessageModelI& rmm, ToxContactModel2& tcm, NGCFT1& nft ) : - _cr(cr), + _cs(cs), _rmm(rmm), _tcm(tcm), _nft(nft), @@ -111,7 +112,7 @@ float NGCHS2Sigma::iterate(float delta) { continue; } - Contact3Handle c{_cr, cv}; + ContactHandle4 c = _cs.contactHandle(cv); auto& iirr = c.get_or_emplace(); // dedup queued from running @@ -129,7 +130,7 @@ float NGCHS2Sigma::iterate(float delta) { iirq._queue.pop_front(); continue; // how } - const Contact3Handle group_c = {*c.registry(), c.get().parent}; + const ContactHandle4 group_c = {*c.registry(), c.get().parent}; if (!c.all_of()) { iirq._queue.pop_front(); continue; @@ -166,15 +167,17 @@ float NGCHS2Sigma::iterate(float delta) { } }; + auto& cr = _cs.registry(); + // first handle range requests on weak self - fn_iirq(_cr.view()); + fn_iirq(cr.view()); // we could stop here, if too much is already running // then range on others - fn_iirq(_cr.view(entt::exclude_t{})); + fn_iirq(cr.view(entt::exclude_t{})); - _cr.view().each( + cr.view().each( [delta](const auto cv, Components::IncommingTimeRangeRequestRunning& irr) { std::vector to_remove; for (auto&& [ft_id, entry] : irr._list) { @@ -195,7 +198,7 @@ float NGCHS2Sigma::iterate(float delta) { return 1000.f; } -void NGCHS2Sigma::handleTimeRange(Contact3Handle c, const Events::NGCFT1_recv_request& e) { +void NGCHS2Sigma::handleTimeRange(ContactHandle4 c, const Events::NGCFT1_recv_request& e) { ByteSpan fid{e.file_id, e.file_id_size}; // TODO: better size check if (fid.size != sizeof(uint64_t)+sizeof(uint64_t)) { @@ -239,7 +242,7 @@ void NGCHS2Sigma::handleTimeRange(Contact3Handle c, const Events::NGCFT1_recv_re ); } -std::vector NGCHS2Sigma::buildChatLogFileRange(Contact3Handle c, uint64_t ts_start, uint64_t ts_end) { +std::vector NGCHS2Sigma::buildChatLogFileRange(ContactHandle4 c, uint64_t ts_start, uint64_t ts_end) { const Message3Registry* reg_ptr = static_cast(_rmm).get(c); if (reg_ptr == nullptr) { return {}; @@ -305,12 +308,12 @@ std::vector NGCHS2Sigma::buildChatLogFileRange(Contact3Handle c, uint64 continue; } - if (!_cr.valid(c_from_c.c)) { + ContactHandle4 c_from = _cs.contactHandle(c_from_c.c); + + if (!static_cast(c_from)) { continue; // ??? } - Contact3Handle c_from{_cr, c_from_c.c}; - if (!c_from.all_of()) { continue; // ??? } diff --git a/solanaceae/ngc_hs2/ngc_hs2_sigma.hpp b/solanaceae/ngc_hs2/ngc_hs2_sigma.hpp index 03d5e85..30d62dc 100644 --- a/solanaceae/ngc_hs2/ngc_hs2_sigma.hpp +++ b/solanaceae/ngc_hs2/ngc_hs2_sigma.hpp @@ -2,7 +2,7 @@ #include -#include +#include #include #include @@ -24,7 +24,7 @@ struct TimeRangeRequest { }; class NGCHS2Sigma : public RegistryMessageModelEventI, public NGCFT1EventI { - Contact3Registry& _cr; + ContactStore4I& _cs; RegistryMessageModelI& _rmm; ToxContactModel2& _tcm; NGCFT1& _nft; @@ -49,11 +49,11 @@ class NGCHS2Sigma : public RegistryMessageModelEventI, public NGCFT1EventI { // FIXME: workaround missing contact events // only used on peer exit (no, also used to quicken lookups) - entt::dense_map _tox_peer_to_contact; + entt::dense_map _tox_peer_to_contact; public: NGCHS2Sigma( - Contact3Registry& cr, + ContactStore4I& cs, RegistryMessageModelI& rmm, ToxContactModel2& tcm, NGCFT1& nft @@ -63,11 +63,11 @@ class NGCHS2Sigma : public RegistryMessageModelEventI, public NGCFT1EventI { float iterate(float delta); - void handleTimeRange(Contact3Handle c, const Events::NGCFT1_recv_request&); + void handleTimeRange(ContactHandle4 c, const Events::NGCFT1_recv_request&); // msg reg contact // time ranges - [[nodiscard]] std::vector buildChatLogFileRange(Contact3Handle c, uint64_t ts_start, uint64_t ts_end); + [[nodiscard]] std::vector buildChatLogFileRange(ContactHandle4 c, uint64_t ts_start, uint64_t ts_end); protected: bool onEvent(const Message::Events::MessageConstruct&) override;