Compare commits

..

No commits in common. "c731d51a468e1238ff383419963cebe991d4b1de" and "31c3ed4688de6f80bb160ce5d3168ac6b57cf318" have entirely different histories.

11 changed files with 76 additions and 115 deletions

21
LICENSE
View File

@ -1,21 +0,0 @@
MIT License
Copyright (c) 2025 Erik Scholz
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -32,12 +32,12 @@ SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_start(struct SolanaAPI* solana_api)
} }
try { try {
auto* cs = PLUG_RESOLVE_INSTANCE(ContactStore4I); auto* cr = PLUG_RESOLVE_INSTANCE_VERSIONED(Contact3Registry, "1");
// static store, could be anywhere tho // static store, could be anywhere tho
// construct with fetched dependencies // construct with fetched dependencies
g_crdtn = std::make_unique<CRDTNotes>(); g_crdtn = std::make_unique<CRDTNotes>();
g_crdtns = std::make_unique<CRDTNotesSync>(*g_crdtn, *cs); g_crdtns = std::make_unique<CRDTNotesSync>(*g_crdtn, *cr);
// register types // register types
PLUG_PROVIDE_INSTANCE(CRDTNotesSync, plugin_name, g_crdtns.get()); PLUG_PROVIDE_INSTANCE(CRDTNotesSync, plugin_name, g_crdtns.get());

View File

@ -33,7 +33,7 @@ SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_start(struct SolanaAPI* solana_api)
try { try {
auto* crdtns = PLUG_RESOLVE_INSTANCE(CRDTNotesSync); auto* crdtns = PLUG_RESOLVE_INSTANCE(CRDTNotesSync);
auto* cs = PLUG_RESOLVE_INSTANCE(ContactStore4I); auto* cr = PLUG_RESOLVE_INSTANCE_VERSIONED(Contact3Registry, "1");
auto* imguic = PLUG_RESOLVE_INSTANCE_VERSIONED(ImGuiContext, ImGui::GetVersion()); auto* imguic = PLUG_RESOLVE_INSTANCE_VERSIONED(ImGuiContext, ImGui::GetVersion());
auto* imguimemaf = PLUG_RESOLVE_INSTANCE_VERSIONED(ImGuiMemAllocFunc, ImGui::GetVersion()); auto* imguimemaf = PLUG_RESOLVE_INSTANCE_VERSIONED(ImGuiMemAllocFunc, ImGui::GetVersion());
auto* imguimemff = PLUG_RESOLVE_INSTANCE_VERSIONED(ImGuiMemFreeFunc, ImGui::GetVersion()); auto* imguimemff = PLUG_RESOLVE_INSTANCE_VERSIONED(ImGuiMemFreeFunc, ImGui::GetVersion());
@ -45,7 +45,7 @@ SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_start(struct SolanaAPI* solana_api)
// static store, could be anywhere tho // static store, could be anywhere tho
// construct with fetched dependencies // construct with fetched dependencies
g_crdtn_imgui = std::make_unique<CRDTNotesImGui>(*crdtns, *cs); g_crdtn_imgui = std::make_unique<CRDTNotesImGui>(*crdtns, *cr);
// register types // register types
PLUG_PROVIDE_INSTANCE(CRDTNotesImGui, plugin_name, g_crdtn_imgui.get()); PLUG_PROVIDE_INSTANCE(CRDTNotesImGui, plugin_name, g_crdtn_imgui.get());

View File

@ -3,6 +3,7 @@
#include <solanaceae/crdtnotes/crdtnotes.hpp> #include <solanaceae/crdtnotes/crdtnotes.hpp>
#include <solanaceae/crdtnotes/crdtnotes_sync.hpp> #include <solanaceae/crdtnotes/crdtnotes_sync.hpp>
#include <solanaceae/crdtnotes_toxsync/crdtnotes_toxsync.hpp> #include <solanaceae/crdtnotes_toxsync/crdtnotes_toxsync.hpp>
#include <solanaceae/contact/contact_model3.hpp>
#include <solanaceae/toxcore/tox_interface.hpp> #include <solanaceae/toxcore/tox_interface.hpp>
#include <solanaceae/toxcore/tox_event_interface.hpp> #include <solanaceae/toxcore/tox_event_interface.hpp>
#include <solanaceae/tox_contacts/tox_contact_model2.hpp> #include <solanaceae/tox_contacts/tox_contact_model2.hpp>
@ -36,14 +37,14 @@ SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_start(struct SolanaAPI* solana_api)
try { try {
auto* notes_sync = PLUG_RESOLVE_INSTANCE(CRDTNotesEventI); auto* notes_sync = PLUG_RESOLVE_INSTANCE(CRDTNotesEventI);
auto* cs = PLUG_RESOLVE_INSTANCE(ContactStore4I); auto* cr = PLUG_RESOLVE_INSTANCE_VERSIONED(Contact3Registry, "1");
auto* t = PLUG_RESOLVE_INSTANCE(ToxI); auto* t = PLUG_RESOLVE_INSTANCE(ToxI);
auto* tep = PLUG_RESOLVE_INSTANCE(ToxEventProviderI); auto* tep = PLUG_RESOLVE_INSTANCE(ToxEventProviderI);
auto* tcm = PLUG_RESOLVE_INSTANCE(ToxContactModel2); auto* tcm = PLUG_RESOLVE_INSTANCE(ToxContactModel2);
// static store, could be anywhere tho // static store, could be anywhere tho
// construct with fetched dependencies // construct with fetched dependencies
g_crdtn_ts = std::make_unique<CRDTNotesToxSync>(*notes_sync, *cs, *t, *tep, *tcm); g_crdtn_ts = std::make_unique<CRDTNotesToxSync>(*notes_sync, *cr, *t, *tep, *tcm);
// register types // register types
PLUG_PROVIDE_INSTANCE(CRDTNotesToxSync, plugin_name, g_crdtn_ts.get()); PLUG_PROVIDE_INSTANCE(CRDTNotesToxSync, plugin_name, g_crdtn_ts.get());

View File

@ -2,7 +2,7 @@
#include "./crdtnotes.hpp" #include "./crdtnotes.hpp"
#include <solanaceae/contact/fwd.hpp> #include <solanaceae/contact/contact_model3.hpp>
// send api // send api
struct CRDTNotesContactSyncModelI { struct CRDTNotesContactSyncModelI {
@ -12,12 +12,12 @@ struct CRDTNotesContactSyncModelI {
public: public:
// notify of doc existing // notify of doc existing
virtual void SendGossip( virtual void SendGossip(
ContactHandle4 c, Contact3Handle c,
const CRDTNotes::DocID& doc_id const CRDTNotes::DocID& doc_id
) = 0; ) = 0;
virtual void SendGossip( virtual void SendGossip(
ContactHandle4 c, Contact3Handle c,
const CRDTNotes::DocID& doc_id, const CRDTNotes::DocID& doc_id,
const std::vector<CRDTNotes::Frontier>& selected_frontier const std::vector<CRDTNotes::Frontier>& selected_frontier
) = 0; ) = 0;
@ -26,13 +26,13 @@ struct CRDTNotesContactSyncModelI {
public: public:
// causes the other peer to send gossip with all known frontiers (on cool down) // causes the other peer to send gossip with all known frontiers (on cool down)
virtual void SendFetchCompleteFrontier( virtual void SendFetchCompleteFrontier(
ContactHandle4 c, Contact3Handle c,
const CRDTNotes::DocID& doc_id const CRDTNotes::DocID& doc_id
) = 0; ) = 0;
// action range request // action range request
virtual void SendFetchOps( virtual void SendFetchOps(
ContactHandle4 c, Contact3Handle c,
const CRDTNotes::DocID& doc_id, const CRDTNotes::DocID& doc_id,
const CRDTNotes::CRDTAgent& agent, const CRDTNotes::CRDTAgent& agent,
const uint64_t seq_from, const uint64_t seq_from,
@ -41,7 +41,7 @@ struct CRDTNotesContactSyncModelI {
public: // ops response public: // ops response
virtual void SendOps( virtual void SendOps(
ContactHandle4 c, Contact3Handle c,
const CRDTNotes::DocID& doc_id, const CRDTNotes::DocID& doc_id,
// TODO: optimize this // TODO: optimize this
const std::vector<CRDTNotes::Doc::Op>& const std::vector<CRDTNotes::Doc::Op>&

View File

@ -1,6 +1,5 @@
#include "./crdtnotes_sync.hpp" #include "./crdtnotes_sync.hpp"
#include <solanaceae/contact/contact_store_i.hpp>
#include <solanaceae/crdtnotes/crdtnotes_contact_sync_model.hpp> #include <solanaceae/crdtnotes/crdtnotes_contact_sync_model.hpp>
#include <solanaceae/contact/components.hpp> #include <solanaceae/contact/components.hpp>
@ -18,7 +17,7 @@ static ID32 id_from_vec(const std::vector<uint8_t>& vec) {
return new_id; return new_id;
} }
CRDTNotesSync::CRDTNotesSync(CRDTNotes& notes, ContactStore4I& cs) : _notes(notes), _cs(cs) { CRDTNotesSync::CRDTNotesSync(CRDTNotes& notes, Contact3Registry& cr) : _notes(notes), _cr(cr) {
_rng.seed(std::random_device{}()); _rng.seed(std::random_device{}());
_rng.discard(707); _rng.discard(707);
} }
@ -88,17 +87,15 @@ CRDTNotes::Doc* CRDTNotesSync::getDoc(const CRDTNotes::DocID& doc_id) {
return _notes.getDoc(doc_id); return _notes.getDoc(doc_id);
} }
std::optional<CRDTNotes::DocID> CRDTNotesSync::addNewDoc(ContactHandle4 c, bool secret) { std::optional<CRDTNotes::DocID> CRDTNotesSync::addNewDoc(Contact3Handle c, bool secret) {
if (!static_cast<bool>(c)) { if (!static_cast<bool>(c)) {
std::cerr << "CRDTNS error: invalid contact\n"; std::cerr << "CRDTNS error: invalid contact\n";
return std::nullopt; return std::nullopt;
} }
const auto& cr = _cs.registry(); const auto& self = c.get<Contact::Components::Self>().self;
assert(_cr.all_of<Contact::Components::ID>(self));
const auto self = c.get<Contact::Components::Self>().self; const auto& self_id = _cr.get<Contact::Components::ID>(self);
assert(cr.all_of<Contact::Components::ID>(self));
const auto& self_id = cr.get<Contact::Components::ID>(self);
assert(!self_id.data.empty()); assert(!self_id.data.empty());
CRDTNotes::CRDTAgent self_agent_id = id_from_vec(self_id.data); CRDTNotes::CRDTAgent self_agent_id = id_from_vec(self_id.data);
@ -130,17 +127,15 @@ std::optional<CRDTNotes::DocID> CRDTNotesSync::addNewDoc(ContactHandle4 c, bool
return new_id; return new_id;
} }
bool CRDTNotesSync::addDoc(const CRDTNotes::DocID& doc_id, ContactHandle4 c) { bool CRDTNotesSync::addDoc(const CRDTNotes::DocID& doc_id, Contact3Handle c) {
if (!static_cast<bool>(c)) { if (!static_cast<bool>(c)) {
std::cerr << "CRDTNS error: invalid contact\n"; std::cerr << "CRDTNS error: invalid contact\n";
return false; return false;
} }
const auto& cr = _cs.registry();
const auto& self = c.get<Contact::Components::Self>().self; const auto& self = c.get<Contact::Components::Self>().self;
assert(cr.all_of<Contact::Components::ID>(self)); assert(_cr.all_of<Contact::Components::ID>(self));
const auto& self_id = cr.get<Contact::Components::ID>(self); const auto& self_id = _cr.get<Contact::Components::ID>(self);
assert(!self_id.data.empty()); assert(!self_id.data.empty());
CRDTNotes::CRDTAgent self_agent_id = id_from_vec(self_id.data); CRDTNotes::CRDTAgent self_agent_id = id_from_vec(self_id.data);
@ -163,12 +158,12 @@ std::vector<CRDTNotes::DocID> CRDTNotesSync::getDocList(void) {
return _notes.getDocList(); return _notes.getDocList();
} }
std::vector<CRDTNotes::DocID> CRDTNotesSync::getDocList(ContactHandle4 c) { std::vector<CRDTNotes::DocID> CRDTNotesSync::getDocList(Contact3Handle c) {
std::vector<CRDTNotes::DocID> list; std::vector<CRDTNotes::DocID> list;
ContactHandle4 parent; Contact3Handle parent;
if (c.all_of<Contact::Components::Parent>()) { if (c.all_of<Contact::Components::Parent>()) {
parent = ContactHandle4{*c.registry(), c.get<Contact::Components::Parent>().parent}; parent = Contact3Handle{*c.registry(), c.get<Contact::Components::Parent>().parent};
} }
for (const auto& [k, v] : _docs_contacts) { for (const auto& [k, v] : _docs_contacts) {

View File

@ -2,15 +2,10 @@
#include "./crdtnotes.hpp" #include "./crdtnotes.hpp"
#include <solanaceae/contact/fwd.hpp> #include <solanaceae/contact/contact_model3.hpp>
#include <entt/entity/registry.hpp>
#include <entt/entity/handle.hpp>
#include <set> #include <set>
#include <random> #include <random>
#include <unordered_map>
#include <map>
// fwd // fwd
struct CRDTNotesContactSyncModelI; struct CRDTNotesContactSyncModelI;
@ -19,7 +14,7 @@ namespace Events {
// - DocID // - DocID
struct NGCEXT_crdtns_gossip { struct NGCEXT_crdtns_gossip {
ContactHandle4 c; Contact3Handle c;
CRDTNotes::DocID doc_id; CRDTNotes::DocID doc_id;
}; };
@ -29,14 +24,14 @@ namespace Events {
// - seq (frontier) // - seq (frontier)
// - ] // - ]
struct NGCEXT_crdtns_gossip_frontier { struct NGCEXT_crdtns_gossip_frontier {
ContactHandle4 c; Contact3Handle c;
CRDTNotes::DocID doc_id; CRDTNotes::DocID doc_id;
std::vector<CRDTNotes::Frontier> selected_frontier; std::vector<CRDTNotes::Frontier> selected_frontier;
}; };
// - DocID // - DocID
struct NGCEXT_crdtns_fetch_complete_frontier { struct NGCEXT_crdtns_fetch_complete_frontier {
ContactHandle4 c; Contact3Handle c;
CRDTNotes::DocID doc_id; CRDTNotes::DocID doc_id;
}; };
@ -45,7 +40,7 @@ namespace Events {
// - seq_from // - seq_from
// - seq_to // - seq_to
struct NGCEXT_crdtns_fetch_op_range { struct NGCEXT_crdtns_fetch_op_range {
ContactHandle4 c; Contact3Handle c;
CRDTNotes::DocID doc_id; CRDTNotes::DocID doc_id;
CRDTNotes::CRDTAgent agent; CRDTNotes::CRDTAgent agent;
uint64_t seq_from; uint64_t seq_from;
@ -57,7 +52,7 @@ namespace Events {
// - op // - op
// - ] // - ]
struct NGCEXT_crdtns_ops { struct NGCEXT_crdtns_ops {
ContactHandle4 c; Contact3Handle c;
CRDTNotes::DocID doc_id; CRDTNotes::DocID doc_id;
std::vector<CRDTNotes::Doc::Op> ops; std::vector<CRDTNotes::Doc::Op> ops;
}; };
@ -81,24 +76,18 @@ struct CRDTNotesEventI {
class CRDTNotesSync final : public CRDTNotesEventI { class CRDTNotesSync final : public CRDTNotesEventI {
// pull inside???? // pull inside????
CRDTNotes& _notes; CRDTNotes& _notes;
ContactStore4I& _cs; Contact3Registry& _cr;
std::default_random_engine _rng; std::default_random_engine _rng;
std::unordered_map<CRDTNotes::DocID, std::set<ContactHandle4>> _docs_contacts; std::unordered_map<CRDTNotes::DocID, std::set<Contact3Handle>> _docs_contacts;
struct Peer {
// global frontier
// what we know the peer knows(/gossiped) about
std::unordered_map<decltype(CRDTNotes::Frontier::agent), decltype(CRDTNotes::Frontier::seq)> other_frontier;
};
std::unordered_map<CRDTNotes::DocID, std::map<ContactHandle4, Peer>> _docs_peers;
// if a doc is eg new, it is added here // if a doc is eg new, it is added here
std::set<CRDTNotes::DocID> _gossip_queue; // TODO: no std::set<CRDTNotes::DocID> _gossip_queue;
std::set<CRDTNotes::DocID> _fetch_frontier_queue; std::set<CRDTNotes::DocID> _fetch_frontier_queue;
public: public:
CRDTNotesSync(CRDTNotes& notes, ContactStore4I& cs); CRDTNotesSync(CRDTNotes& notes, Contact3Registry& cr);
~CRDTNotesSync(void); ~CRDTNotesSync(void);
@ -110,14 +99,14 @@ class CRDTNotesSync final : public CRDTNotesEventI {
// adds a doc and assosiates contact (and self) // adds a doc and assosiates contact (and self)
// if secret, only self is added (and thats why contact is needed) // if secret, only self is added (and thats why contact is needed)
std::optional<CRDTNotes::DocID> addNewDoc(ContactHandle4 c, bool secret = false); std::optional<CRDTNotes::DocID> addNewDoc(Contact3Handle c, bool secret = false);
// adds a doc by id to a contact // adds a doc by id to a contact
// (for gossip or manual add) // (for gossip or manual add)
bool addDoc(const CRDTNotes::DocID& doc_id, ContactHandle4 c); bool addDoc(const CRDTNotes::DocID& doc_id, Contact3Handle c);
std::vector<CRDTNotes::DocID> getDocList(void); std::vector<CRDTNotes::DocID> getDocList(void);
std::vector<CRDTNotes::DocID> getDocList(ContactHandle4 c); std::vector<CRDTNotes::DocID> getDocList(Contact3Handle c);
void merge(const CRDTNotes::DocID& doc_id, std::string_view new_text); void merge(const CRDTNotes::DocID& doc_id, std::string_view new_text);

View File

@ -1,6 +1,5 @@
#include "./crdtnotes_imgui.hpp" #include "./crdtnotes_imgui.hpp"
#include <solanaceae/contact/contact_store_i.hpp>
#include <solanaceae/contact/components.hpp> #include <solanaceae/contact/components.hpp>
#include <cstdint> #include <cstdint>
@ -48,7 +47,7 @@ namespace detail {
} // detail } // detail
CRDTNotesImGui::CRDTNotesImGui(CRDTNotesSync& notes_sync, ContactStore4I& cs) : _notes_sync(notes_sync), _cs(cs) { CRDTNotesImGui::CRDTNotesImGui(CRDTNotesSync& notes_sync, Contact3Registry& cr) : _notes_sync(notes_sync), _cr(cr) {
} }
float CRDTNotesImGui::render(void) { float CRDTNotesImGui::render(void) {
@ -59,7 +58,7 @@ float CRDTNotesImGui::render(void) {
} }
if (ImGui::BeginPopup("create new doc contact")) { if (ImGui::BeginPopup("create new doc contact")) {
for (const auto& c : _cs.registry().view<Contact::Components::TagBig>()) { for (const auto& c : _cr.view<Contact::Components::TagBig>()) {
if (renderContactListContactSmall(c, false)) { if (renderContactListContactSmall(c, false)) {
//const auto& self = _cr.get<Contact::Components::Self>(c).self; //const auto& self = _cr.get<Contact::Components::Self>(c).self;
//assert(_cr.all_of<Contact::Components::ID>(self)); //assert(_cr.all_of<Contact::Components::ID>(self));
@ -77,7 +76,7 @@ float CRDTNotesImGui::render(void) {
//// tox id (id from self) //// tox id (id from self)
//self_agent_id //self_agent_id
//); //);
_notes_sync.addNewDoc(_cs.contactHandle(c), false); _notes_sync.addNewDoc({_cr, c}, false);
//// and open the doc //// and open the doc
} }
@ -123,12 +122,10 @@ float CRDTNotesImGui::render(void) {
return 1.f; return 1.f;
} }
bool CRDTNotesImGui::renderContactListContactSmall(const Contact4 c, const bool selected) const { bool CRDTNotesImGui::renderContactListContactSmall(const Contact3 c, const bool selected) const {
std::string label; std::string label;
const auto& cr = _cs.registry(); label += (_cr.all_of<Contact::Components::Name>(c) ? _cr.get<Contact::Components::Name>(c).name.c_str() : "<unk>");
label += (cr.all_of<Contact::Components::Name>(c) ? cr.get<Contact::Components::Name>(c).name.c_str() : "<unk>");
label += "###"; label += "###";
label += std::to_string(entt::to_integral(c)); label += std::to_string(entt::to_integral(c));

View File

@ -1,24 +1,24 @@
#pragma once #pragma once
#include <solanaceae/crdtnotes/crdtnotes_sync.hpp> #include <solanaceae/crdtnotes/crdtnotes_sync.hpp>
#include <solanaceae/contact/fwd.hpp> #include <solanaceae/contact/contact_model3.hpp>
#include <set> #include <set>
class CRDTNotesImGui { class CRDTNotesImGui {
CRDTNotesSync& _notes_sync; CRDTNotesSync& _notes_sync;
ContactStore4I& _cs; Contact3Registry& _cr;
bool _show_global_list {true}; bool _show_global_list {true};
std::set<CRDTNotes::DocID> _open_docs; std::set<CRDTNotes::DocID> _open_docs;
public: public:
CRDTNotesImGui(CRDTNotesSync& notes_sync, ContactStore4I& cs); CRDTNotesImGui(CRDTNotesSync& notes_sync, Contact3Registry& cr);
float render(void); float render(void);
bool renderContactListContactSmall(const Contact4 c, const bool selected) const; bool renderContactListContactSmall(const Contact3 c, const bool selected) const;
bool renderDoc(const CRDTNotes::DocID& doc_id); bool renderDoc(const CRDTNotes::DocID& doc_id);
bool renderDocText(std::string& text) const; bool renderDocText(std::string& text) const;

View File

@ -1,6 +1,5 @@
#include "./crdtnotes_toxsync.hpp" #include "./crdtnotes_toxsync.hpp"
#include <solanaceae/contact/contact_store_i.hpp>
#include <solanaceae/toxcore/tox_interface.hpp> #include <solanaceae/toxcore/tox_interface.hpp>
#include <solanaceae/tox_contacts/components.hpp> #include <solanaceae/tox_contacts/components.hpp>
@ -40,11 +39,11 @@ enum class NGCEXT_Event : uint8_t {
CRDTNotesToxSync::CRDTNotesToxSync( CRDTNotesToxSync::CRDTNotesToxSync(
CRDTNotesEventI& notes_sync, CRDTNotesEventI& notes_sync,
ContactStore4I& cs, Contact3Registry& cr,
ToxI& t, ToxI& t,
ToxEventProviderI& tep, ToxEventProviderI& tep,
ToxContactModel2& tcm ToxContactModel2& tcm
) : _notes_sync(notes_sync), _cs(cs), _t(t), _tep_sr(tep.newSubRef(this)), _tcm(tcm) { ) : _notes_sync(notes_sync), _cr(cr), _t(t), _tep_sr(tep.newSubRef(this)), _tcm(tcm) {
// TODO: non groups // TODO: non groups
// should be called for every peer (except self) // should be called for every peer (except self)
@ -59,13 +58,13 @@ CRDTNotesToxSync::CRDTNotesToxSync(
CRDTNotesToxSync::~CRDTNotesToxSync(void) { CRDTNotesToxSync::~CRDTNotesToxSync(void) {
// TODO: find a better way to remove dangling pointers // TODO: find a better way to remove dangling pointers
std::vector<Contact4> to_remove_self; std::vector<Contact3> to_remove_self;
_cs.registry().view<CRDTNotesContactSyncModelI*>().each([&to_remove_self, this](Contact4 c, const auto* csm) { _cr.view<CRDTNotesContactSyncModelI*>().each([&to_remove_self, this](Contact3 c, const auto* csm) {
if (this == csm) { if (this == csm) {
to_remove_self.push_back(c); to_remove_self.push_back(c);
} }
}); });
_cs.registry().remove<CRDTNotesContactSyncModelI*>(to_remove_self.cbegin(), to_remove_self.cend()); _cr.remove<CRDTNotesContactSyncModelI*>(to_remove_self.cbegin(), to_remove_self.cend());
} }
float CRDTNotesToxSync::iterate(float time_delta) { float CRDTNotesToxSync::iterate(float time_delta) {
@ -74,7 +73,7 @@ float CRDTNotesToxSync::iterate(float time_delta) {
} }
void CRDTNotesToxSync::SendGossip( void CRDTNotesToxSync::SendGossip(
ContactHandle4 c, Contact3Handle c,
const CRDTNotes::DocID& doc_id const CRDTNotes::DocID& doc_id
) { ) {
if (!c.all_of<Contact::Components::ToxGroupPeerEphemeral>()) { if (!c.all_of<Contact::Components::ToxGroupPeerEphemeral>()) {
@ -99,7 +98,7 @@ void CRDTNotesToxSync::SendGossip(
} }
void CRDTNotesToxSync::SendGossip( void CRDTNotesToxSync::SendGossip(
ContactHandle4 c, Contact3Handle c,
const CRDTNotes::DocID& doc_id, const CRDTNotes::DocID& doc_id,
const std::vector<CRDTNotes::Frontier>& selected_frontier const std::vector<CRDTNotes::Frontier>& selected_frontier
) { ) {
@ -140,7 +139,7 @@ void CRDTNotesToxSync::SendGossip(
} }
void CRDTNotesToxSync::SendFetchCompleteFrontier( void CRDTNotesToxSync::SendFetchCompleteFrontier(
ContactHandle4 c, Contact3Handle c,
const CRDTNotes::DocID& doc_id const CRDTNotes::DocID& doc_id
) { ) {
if (!c.all_of<Contact::Components::ToxGroupPeerEphemeral>()) { if (!c.all_of<Contact::Components::ToxGroupPeerEphemeral>()) {
@ -165,7 +164,7 @@ void CRDTNotesToxSync::SendFetchCompleteFrontier(
} }
void CRDTNotesToxSync::SendFetchOps( void CRDTNotesToxSync::SendFetchOps(
ContactHandle4 c, Contact3Handle c,
const CRDTNotes::DocID& doc_id, const CRDTNotes::DocID& doc_id,
const CRDTNotes::CRDTAgent& agent, const CRDTNotes::CRDTAgent& agent,
const uint64_t seq_from, const uint64_t seq_from,
@ -208,7 +207,7 @@ void CRDTNotesToxSync::SendFetchOps(
} }
void CRDTNotesToxSync::SendOps( void CRDTNotesToxSync::SendOps(
ContactHandle4 c, Contact3Handle c,
const CRDTNotes::DocID& doc_id, const CRDTNotes::DocID& doc_id,
const std::vector<CRDTNotes::Doc::Op>& ops const std::vector<CRDTNotes::Doc::Op>& ops
) { ) {
@ -289,7 +288,7 @@ void CRDTNotesToxSync::SendOps(
} }
bool CRDTNotesToxSync::parse_crdtn_gossip( bool CRDTNotesToxSync::parse_crdtn_gossip(
ContactHandle4 c, Contact3Handle c,
const uint8_t* data, size_t data_size, const uint8_t* data, size_t data_size,
bool // dont care private bool // dont care private
) { ) {
@ -314,7 +313,7 @@ bool CRDTNotesToxSync::parse_crdtn_gossip(
} }
bool CRDTNotesToxSync::parse_crdtn_gossip_frontier( bool CRDTNotesToxSync::parse_crdtn_gossip_frontier(
ContactHandle4 c, Contact3Handle c,
const uint8_t* data, size_t data_size, const uint8_t* data, size_t data_size,
bool // dont care private bool // dont care private
) { ) {
@ -352,7 +351,7 @@ bool CRDTNotesToxSync::parse_crdtn_gossip_frontier(
} }
bool CRDTNotesToxSync::parse_crdtn_fetch_complete_frontier( bool CRDTNotesToxSync::parse_crdtn_fetch_complete_frontier(
ContactHandle4 c, Contact3Handle c,
const uint8_t* data, size_t data_size, const uint8_t* data, size_t data_size,
bool // dont care private bool // dont care private
) { ) {
@ -372,7 +371,7 @@ bool CRDTNotesToxSync::parse_crdtn_fetch_complete_frontier(
} }
bool CRDTNotesToxSync::parse_crdtn_fetch_op_range( bool CRDTNotesToxSync::parse_crdtn_fetch_op_range(
ContactHandle4 c, Contact3Handle c,
const uint8_t* data, size_t data_size, const uint8_t* data, size_t data_size,
bool // dont care private bool // dont care private
) { ) {
@ -409,7 +408,7 @@ bool CRDTNotesToxSync::parse_crdtn_fetch_op_range(
} }
bool CRDTNotesToxSync::parse_crdtn_ops( bool CRDTNotesToxSync::parse_crdtn_ops(
ContactHandle4 c, Contact3Handle c,
const uint8_t* data, size_t data_size, const uint8_t* data, size_t data_size,
bool // dont care private bool // dont care private
) { ) {

View File

@ -1,8 +1,9 @@
#pragma once #pragma once
#include <solanaceae/crdtnotes/crdtnotes_sync.hpp> #include "solanaceae/crdtnotes/crdtnotes_sync.hpp"
#include <solanaceae/crdtnotes/crdtnotes.hpp>
#include <solanaceae/crdtnotes/crdtnotes_contact_sync_model.hpp> #include <solanaceae/crdtnotes/crdtnotes_contact_sync_model.hpp>
#include <solanaceae/contact/fwd.hpp> #include <solanaceae/contact/contact_model3.hpp>
#include <solanaceae/toxcore/tox_event_interface.hpp> #include <solanaceae/toxcore/tox_event_interface.hpp>
#include <solanaceae/tox_contacts/tox_contact_model2.hpp> #include <solanaceae/tox_contacts/tox_contact_model2.hpp>
@ -13,7 +14,7 @@ struct ToxEventProviderI;
// implements CRDTNotesContactSyncModelI and attaches itself to tox contacts // implements CRDTNotesContactSyncModelI and attaches itself to tox contacts
class CRDTNotesToxSync : public CRDTNotesContactSyncModelI, public ToxEventI { class CRDTNotesToxSync : public CRDTNotesContactSyncModelI, public ToxEventI {
CRDTNotesEventI& _notes_sync; CRDTNotesEventI& _notes_sync;
ContactStore4I& _cs; Contact3Registry& _cr;
ToxI& _t; ToxI& _t;
ToxEventProviderI::SubscriptionReference _tep_sr; ToxEventProviderI::SubscriptionReference _tep_sr;
ToxContactModel2& _tcm; ToxContactModel2& _tcm;
@ -21,7 +22,7 @@ class CRDTNotesToxSync : public CRDTNotesContactSyncModelI, public ToxEventI {
public: public:
CRDTNotesToxSync( CRDTNotesToxSync(
CRDTNotesEventI& notes_sync, CRDTNotesEventI& notes_sync,
ContactStore4I& cs, Contact3Registry& cr,
ToxI& t, ToxI& t,
ToxEventProviderI& tep, ToxEventProviderI& tep,
ToxContactModel2& tcm ToxContactModel2& tcm
@ -32,23 +33,23 @@ class CRDTNotesToxSync : public CRDTNotesContactSyncModelI, public ToxEventI {
public: // sync api public: // sync api
void SendGossip( void SendGossip(
ContactHandle4 c, Contact3Handle c,
const CRDTNotes::DocID& doc_id const CRDTNotes::DocID& doc_id
) override; ) override;
void SendGossip( void SendGossip(
ContactHandle4 c, Contact3Handle c,
const CRDTNotes::DocID& doc_id, const CRDTNotes::DocID& doc_id,
const std::vector<CRDTNotes::Frontier>& selected_frontier const std::vector<CRDTNotes::Frontier>& selected_frontier
) override; ) override;
void SendFetchCompleteFrontier( void SendFetchCompleteFrontier(
ContactHandle4 c, Contact3Handle c,
const CRDTNotes::DocID& doc_id const CRDTNotes::DocID& doc_id
) override; ) override;
void SendFetchOps( void SendFetchOps(
ContactHandle4 c, Contact3Handle c,
const CRDTNotes::DocID& doc_id, const CRDTNotes::DocID& doc_id,
const CRDTNotes::CRDTAgent& agent, const CRDTNotes::CRDTAgent& agent,
const uint64_t seq_from, const uint64_t seq_from,
@ -56,34 +57,34 @@ class CRDTNotesToxSync : public CRDTNotesContactSyncModelI, public ToxEventI {
) override; ) override;
void SendOps( void SendOps(
ContactHandle4 c, Contact3Handle c,
const CRDTNotes::DocID& doc_id, const CRDTNotes::DocID& doc_id,
const std::vector<CRDTNotes::Doc::Op>& const std::vector<CRDTNotes::Doc::Op>&
) override; ) override;
private: private:
bool parse_crdtn_gossip( bool parse_crdtn_gossip(
ContactHandle4 c, Contact3Handle c,
const uint8_t* data, size_t data_size, const uint8_t* data, size_t data_size,
bool _private bool _private
); );
bool parse_crdtn_gossip_frontier( bool parse_crdtn_gossip_frontier(
ContactHandle4 c, Contact3Handle c,
const uint8_t* data, size_t data_size, const uint8_t* data, size_t data_size,
bool _private bool _private
); );
bool parse_crdtn_fetch_complete_frontier( bool parse_crdtn_fetch_complete_frontier(
ContactHandle4 c, Contact3Handle c,
const uint8_t* data, size_t data_size, const uint8_t* data, size_t data_size,
bool _private bool _private
); );
bool parse_crdtn_fetch_op_range( bool parse_crdtn_fetch_op_range(
ContactHandle4 c, Contact3Handle c,
const uint8_t* data, size_t data_size, const uint8_t* data, size_t data_size,
bool _private bool _private
); );
bool parse_crdtn_ops( bool parse_crdtn_ops(
ContactHandle4 c, Contact3Handle c,
const uint8_t* data, size_t data_size, const uint8_t* data, size_t data_size,
bool _private bool _private
); );