diff --git a/include/opendht/dhtrunner.h b/include/opendht/dhtrunner.h index 6ee06ed0e224ead41ef776e60c824860e9d27d97..47f970704b37577475c3492c0ab31d3ed3385198 100644 --- a/include/opendht/dhtrunner.h +++ b/include/opendht/dhtrunner.h @@ -54,20 +54,20 @@ public: DhtRunner(); virtual ~DhtRunner(); - void get(InfoHash id, GetCallbackSimple cb, DoneCallback donecb={}, Value::Filter f = Value::AllFilter()) { - get(id, bindGetCb(cb), donecb, f); + void get(InfoHash id, GetCallbackSimple cb, DoneCallback donecb={}, Value::Filter f = Value::AllFilter(), Where w = {}) { + get(id, bindGetCb(cb), donecb, f, w); } - void get(InfoHash id, GetCallbackSimple cb, DoneCallbackSimple donecb={}, Value::Filter f = Value::AllFilter()) { - get(id, bindGetCb(cb), donecb, f); + void get(InfoHash id, GetCallbackSimple cb, DoneCallbackSimple donecb={}, Value::Filter f = Value::AllFilter(), Where w = {}) { + get(id, bindGetCb(cb), donecb, f, w); } - void get(InfoHash hash, GetCallback vcb, DoneCallback dcb, Value::Filter f={}); + void get(InfoHash hash, GetCallback vcb, DoneCallback dcb, Value::Filter f={}, Where w = {}); - void get(InfoHash id, GetCallback cb, DoneCallbackSimple donecb={}, Value::Filter f = Value::AllFilter()) { - get(id, cb, bindDoneCb(donecb), f); + void get(InfoHash id, GetCallback cb, DoneCallbackSimple donecb={}, Value::Filter f = Value::AllFilter(), Where w = {}) { + get(id, cb, bindDoneCb(donecb), f, w); } - void get(const std::string& key, GetCallback vcb, DoneCallbackSimple dcb={}, Value::Filter f = Value::AllFilter()); + void get(const std::string& key, GetCallback vcb, DoneCallbackSimple dcb={}, Value::Filter f = Value::AllFilter(), Where w = {}); template <class T> void get(InfoHash hash, std::function<bool(std::vector<T>&&)> cb, DoneCallbackSimple dcb={}) @@ -96,7 +96,7 @@ public: getFilterSet<T>()); } - std::future<std::vector<std::shared_ptr<dht::Value>>> get(InfoHash key, Value::Filter f = Value::AllFilter()) { + std::future<std::vector<std::shared_ptr<dht::Value>>> get(InfoHash key, Value::Filter f = Value::AllFilter(), Where w = {}) { auto p = std::make_shared<std::promise<std::vector<std::shared_ptr< dht::Value >>>>(); auto values = std::make_shared<std::vector<std::shared_ptr< dht::Value >>>(); get(key, [=](const std::vector<std::shared_ptr<dht::Value>>& vlist) { @@ -105,7 +105,7 @@ public: }, [=](bool) { p->set_value(std::move(*values)); }, - f); + f, w); return p->get_future(); } @@ -122,10 +122,15 @@ public: return p->get_future(); } - std::future<size_t> listen(InfoHash key, GetCallback vcb, Value::Filter f = Value::AllFilter()); - std::future<size_t> listen(const std::string& key, GetCallback vcb, Value::Filter f = Value::AllFilter()); - std::future<size_t> listen(InfoHash key, GetCallbackSimple cb, Value::Filter f = Value::AllFilter()) { - return listen(key, bindGetCb(cb), f); + void query(const InfoHash& hash, QueryCallback cb, DoneCallback done_cb = {}, Query q = {}); + void query(const InfoHash& hash, QueryCallback cb, DoneCallbackSimple done_cb = {}, Query q = {}) { + query(hash, cb, bindDoneCb(done_cb), q); + } + + std::future<size_t> listen(InfoHash key, GetCallback vcb, Value::Filter f = Value::AllFilter(), Where w = {}); + std::future<size_t> listen(const std::string& key, GetCallback vcb, Value::Filter f = Value::AllFilter(), Where w = {}); + std::future<size_t> listen(InfoHash key, GetCallbackSimple cb, Value::Filter f = Value::AllFilter(), Where w = {}) { + return listen(key, bindGetCb(cb), f, w); } template <class T> @@ -137,7 +142,7 @@ public: getFilterSet<T>()); } template <typename T> - std::future<size_t> listen(InfoHash hash, std::function<bool(T&&)> cb, Value::Filter f = Value::AllFilter()) + std::future<size_t> listen(InfoHash hash, std::function<bool(T&&)> cb, Value::Filter f = Value::AllFilter(), Where w = {}) { return listen(hash, [=](const std::vector<std::shared_ptr<Value>>& vals) { for (const auto& v : vals) { @@ -150,7 +155,7 @@ public: } return true; }, - getFilterSet<T>(f)); + getFilterSet<T>(f), w); } void cancelListen(InfoHash h, size_t token); diff --git a/src/dhtrunner.cpp b/src/dhtrunner.cpp index ed24473d877a296661aebbfdb04a3b463d003559..8a8cc01b69ca868a6766f520497aebd8c92433e1 100644 --- a/src/dhtrunner.cpp +++ b/src/dhtrunner.cpp @@ -429,37 +429,44 @@ DhtRunner::doRun(const sockaddr_in* sin4, const sockaddr_in6* sin6, SecureDht::C } void -DhtRunner::get(InfoHash hash, GetCallback vcb, DoneCallback dcb, Value::Filter f) +DhtRunner::get(InfoHash hash, GetCallback vcb, DoneCallback dcb, Value::Filter f, Where w) { std::lock_guard<std::mutex> lck(storage_mtx); pending_ops.emplace([=](SecureDht& dht) mutable { - dht.get(hash, vcb, dcb, std::move(f)); + dht.get(hash, vcb, dcb, std::move(f), std::move(w)); }); cv.notify_all(); } void -DhtRunner::get(const std::string& key, GetCallback vcb, DoneCallbackSimple dcb, Value::Filter f) +DhtRunner::get(const std::string& key, GetCallback vcb, DoneCallbackSimple dcb, Value::Filter f, Where w) { - get(InfoHash::get(key), vcb, dcb, f); + get(InfoHash::get(key), vcb, dcb, f, w); +} +void DhtRunner::query(const InfoHash& hash, QueryCallback cb, DoneCallback done_cb, Query q) { + std::lock_guard<std::mutex> lck(storage_mtx); + pending_ops.emplace([=](SecureDht& dht) mutable { + dht.query(hash, cb, done_cb, std::move(q)); + }); + cv.notify_all(); } std::future<size_t> -DhtRunner::listen(InfoHash hash, GetCallback vcb, Value::Filter f) +DhtRunner::listen(InfoHash hash, GetCallback vcb, Value::Filter f, Where w) { std::lock_guard<std::mutex> lck(storage_mtx); auto ret_token = std::make_shared<std::promise<size_t>>(); pending_ops.emplace([=](SecureDht& dht) mutable { - ret_token->set_value(dht.listen(hash, vcb, std::move(f))); + ret_token->set_value(dht.listen(hash, vcb, std::move(f), std::move(w))); }); cv.notify_all(); return ret_token->get_future(); } std::future<size_t> -DhtRunner::listen(const std::string& key, GetCallback vcb, Value::Filter f) +DhtRunner::listen(const std::string& key, GetCallback vcb, Value::Filter f, Where w) { - return listen(InfoHash::get(key), vcb, f); + return listen(InfoHash::get(key), vcb, f, w); } void