#include "fiko/orkestra/tasima.hpp" namespace fiko::orkestra { TasimaSahte::TasimaSahte(SahteAg& ag, uint64_t nodeId) : ag_(ag), nodeId_(nodeId) { ag_.uclar_[nodeId_] = this; } TasimaSahte::~TasimaSahte() { auto it = ag_.uclar_.find(nodeId_); if (it != ag_.uclar_.end() && it->second == this) ag_.uclar_.erase(it); } bool TasimaSahte::gonder(const NodeAdres& hedef, const SurecCerceve& c) { if (hedef.nodeId == 0 && hedef.pid == 0) return ag_.yayinla(nodeId_, c) > 0; return ag_.teslimEt(nodeId_, hedef, c); } bool SahteAg::teslimEt(uint64_t kaynakNodeId, const NodeAdres& hedef, const SurecCerceve& c) { auto it = uclar_.find(hedef.nodeId); if (it == uclar_.end() || !it->second->alici_) return false; auto k = kopuk_.find(hedef.nodeId); if (k != kopuk_.end() && k->second) return false; auto kk = kopuk_.find(kaynakNodeId); if (kk != kopuk_.end() && kk->second) return false; // Wire turu: kodlama hataları testte yakalansın diye gerçek serialize/deserialize. const std::string wire = surecproto::cerceveSerialize(c); SurecCerceve alinan; if (!surecproto::cerceveDeserialize(wire.data(), wire.size(), alinan)) return false; it->second->alici_(NodeAdres{kaynakNodeId, c.kaynakPid}, alinan); return true; } int SahteAg::yayinla(uint64_t kaynakNodeId, const SurecCerceve& c) { int ulasan = 0; for (auto& [id, uc] : uclar_) { if (id == kaynakNodeId) continue; if (teslimEt(kaynakNodeId, NodeAdres{id, 0}, c)) ++ulasan; } return ulasan; } } // namespace fiko::orkestra