lokinet/llarp/dht/tx.hpp

82 lines
1.9 KiB
C++
Raw Normal View History

2019-01-22 01:14:02 +00:00
#ifndef LLARP_DHT_TX
#define LLARP_DHT_TX
#include <dht/key.hpp>
#include <dht/txowner.hpp>
2019-09-01 12:10:49 +00:00
#include <util/logging/logger.hpp>
2019-02-08 19:43:25 +00:00
#include <util/status.hpp>
2019-01-22 01:14:02 +00:00
#include <set>
#include <vector>
namespace llarp
{
namespace dht
{
struct AbstractContext;
2019-01-22 01:14:02 +00:00
template < typename K, typename V >
2019-04-19 15:10:26 +00:00
struct TX
2019-01-22 01:14:02 +00:00
{
K target;
AbstractContext* parent;
2019-01-22 01:14:02 +00:00
std::set< Key_t > peersAsked;
std::vector< V > valuesFound;
TXOwner whoasked;
TX(const TXOwner& asker, const K& k, AbstractContext* p)
: target(k), parent(p), whoasked(asker)
2019-01-22 01:14:02 +00:00
{
}
2019-07-30 23:42:13 +00:00
virtual ~TX() = default;
2019-01-22 01:14:02 +00:00
2019-01-22 23:50:26 +00:00
void
OnFound(const Key_t& askedPeer, const V& value);
2019-02-11 17:14:43 +00:00
util::StatusObject
2019-04-19 15:10:26 +00:00
ExtractStatus() const
2019-02-08 19:43:25 +00:00
{
2019-02-11 17:14:43 +00:00
util::StatusObject obj{{"whoasked", whoasked.ExtractStatus()},
2020-03-01 15:59:19 +00:00
{"target", target.ExtractStatus()}};
2019-02-11 17:14:43 +00:00
std::vector< util::StatusObject > foundObjs;
std::transform(valuesFound.begin(), valuesFound.end(),
std::back_inserter(foundObjs),
[](const auto& item) -> util::StatusObject {
return item.ExtractStatus();
});
obj["found"] = foundObjs;
2019-02-11 17:14:43 +00:00
std::vector< std::string > asked;
std::transform(
peersAsked.begin(), peersAsked.end(), std::back_inserter(asked),
2019-08-19 21:26:34 +00:00
[](const auto& item) -> std::string { return item.ToString(); });
obj["asked"] = asked;
2019-02-11 17:14:43 +00:00
return obj;
2019-02-08 19:43:25 +00:00
}
2019-01-22 01:14:02 +00:00
virtual bool
Validate(const V& value) const = 0;
virtual void
Start(const TXOwner& peer) = 0;
virtual void
SendReply() = 0;
};
template < typename K, typename V >
inline void
2019-01-22 23:50:26 +00:00
TX< K, V >::OnFound(const Key_t& askedPeer, const V& value)
2019-01-22 01:14:02 +00:00
{
peersAsked.insert(askedPeer);
if(Validate(value))
{
valuesFound.push_back(value);
}
}
} // namespace dht
} // namespace llarp
#endif