From e8d96d3b42d064d805abccf4514963b17f35b7cd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Mon, 21 Oct 2019 14:04:12 -0400
Subject: [PATCH] c wrapper: add support for permanent put

---
 c/opendht.cpp | 42 ++++++++++++++++++++++++++++--------------
 c/opendht_c.h |  4 ++++
 2 files changed, 32 insertions(+), 14 deletions(-)

diff --git a/c/opendht.cpp b/c/opendht.cpp
index ee87e11e..6c5d77fc 100644
--- a/c/opendht.cpp
+++ b/c/opendht.cpp
@@ -10,8 +10,7 @@ extern "C" {
 #endif
 
 // dht::InfoHash
-const char* dht_infohash_print(const dht_infohash* h)
-{
+const char* dht_infohash_print(const dht_infohash* h) {
     return reinterpret_cast<const dht::InfoHash*>(h)->to_c_str();
 }
 
@@ -19,13 +18,11 @@ void dht_infohash_zero(dht_infohash* h) {
     *reinterpret_cast<dht::InfoHash*>(h) = dht::InfoHash{};
 }
 
-void dht_infohash_random(dht_infohash* h)
-{
+void dht_infohash_random(dht_infohash* h) {
     *reinterpret_cast<dht::InfoHash*>(h) = dht::InfoHash::getRandom();
 }
 
-void dht_infohash_get(dht_infohash* h, const uint8_t* dat, size_t dat_size)
-{
+void dht_infohash_get(dht_infohash* h, const uint8_t* dat, size_t dat_size) {
     *reinterpret_cast<dht::InfoHash*>(h) = dht::InfoHash::get(dat, dat_size);
 }
 
@@ -33,19 +30,16 @@ bool dht_infohash_is_zero(const dht_infohash* h) {
     return !static_cast<bool>(*reinterpret_cast<const dht::InfoHash*>(h));
 }
 
-const char* dht_pkid_print(const dht_pkid* h)
-{
+const char* dht_pkid_print(const dht_pkid* h) {
     return reinterpret_cast<const dht::PkId*>(h)->to_c_str();
 }
 
 // dht::Blob
-void dht_blob_delete(dht_blob* data)
-{
+void dht_blob_delete(dht_blob* data) {
     delete reinterpret_cast<dht::Blob*>(data);
 }
 
-dht_data_view dht_blob_get_data(const dht_blob* data)
-{
+dht_data_view dht_blob_get_data(const dht_blob* data) {
     dht_data_view view;
     view.data = reinterpret_cast<const dht::Blob*>(data)->data();
     view.size = reinterpret_cast<const dht::Blob*>(data)->size();
@@ -53,8 +47,7 @@ dht_data_view dht_blob_get_data(const dht_blob* data)
 }
 
 // dht::Value
-dht_data_view dht_value_get_data(const dht_value* data)
-{
+dht_data_view dht_value_get_data(const dht_value* data) {
     const ValueSp& vsp(*reinterpret_cast<const ValueSp*>(data));
     dht_data_view view;
     view.data = vsp->data.data();
@@ -62,6 +55,11 @@ dht_data_view dht_value_get_data(const dht_value* data)
     return view;
 }
 
+dht_value_id dht_value_get_id(const dht_value* data) {
+    const ValueSp& vsp(*reinterpret_cast<const ValueSp*>(data));
+    return vsp->id;
+}
+
 dht_value* dht_value_new(const uint8_t* data, size_t size) {
     return reinterpret_cast<dht_value*>(new ValueSp(std::make_shared<dht::Value>(data, size)));
 }
@@ -256,6 +254,22 @@ void dht_runner_put(dht_runner* r, const dht_infohash* h, const dht_value* v, dh
     });
 }
 
+void dht_runner_put_permanent(dht_runner* r, const dht_infohash* h, const dht_value* v, dht_done_cb done_cb, void* cb_user_data) {
+    auto runner = reinterpret_cast<dht::DhtRunner*>(r);
+    auto hash = reinterpret_cast<const dht::InfoHash*>(h);
+    auto value = reinterpret_cast<const ValueSp*>(v);
+    runner->put(*hash, *value, [done_cb, cb_user_data](bool ok){
+        if (done_cb)
+            done_cb(ok, cb_user_data);
+    }, dht::time_point::max(), true);
+}
+
+void dht_runner_cancel_put(dht_runner* r, const dht_infohash* h, dht_value_id value_id) {
+    auto runner = reinterpret_cast<dht::DhtRunner*>(r);
+    auto hash = reinterpret_cast<const dht::InfoHash*>(h);
+    runner->cancelPut(*hash, value_id);
+}
+
 void dht_runner_shutdown(dht_runner* r, dht_shutdown_cb done_cb, void* cb_user_data) {
     auto runner = reinterpret_cast<dht::DhtRunner*>(r);
     runner->shutdown([done_cb, cb_user_data](){
diff --git a/c/opendht_c.h b/c/opendht_c.h
index 455d3d1b..c70bee4e 100644
--- a/c/opendht_c.h
+++ b/c/opendht_c.h
@@ -21,7 +21,9 @@ typedef struct dht_data_view dht_data_view;
 // dht::Value
 struct OPENDHT_C_PUBLIC dht_value;
 typedef struct dht_value dht_value;
+typedef uint64_t dht_value_id;
 OPENDHT_C_PUBLIC dht_data_view dht_value_get_data(const dht_value* data);
+OPENDHT_C_PUBLIC dht_value_id dht_value_get_id(const dht_value* data);
 OPENDHT_C_PUBLIC dht_value* dht_value_new(const uint8_t* data, size_t size);
 OPENDHT_C_PUBLIC dht_value* dht_value_ref(const dht_value*);
 OPENDHT_C_PUBLIC void dht_value_unref(dht_value*);
@@ -130,6 +132,8 @@ OPENDHT_C_PUBLIC void dht_runner_get(dht_runner* runner, const dht_infohash* has
 OPENDHT_C_PUBLIC dht_op_token* dht_runner_listen(dht_runner* runner, const dht_infohash* hash, dht_value_cb cb, dht_shutdown_cb done_cb, void* cb_user_data);
 OPENDHT_C_PUBLIC void dht_runner_cancel_listen(dht_runner* runner, const dht_infohash* hash, dht_op_token* token);
 OPENDHT_C_PUBLIC void dht_runner_put(dht_runner* runner, const dht_infohash* hash, const dht_value* value, dht_done_cb done_cb, void* cb_user_data);
+OPENDHT_C_PUBLIC void dht_runner_put_permanent(dht_runner* runner, const dht_infohash* hash, const dht_value* value, dht_done_cb done_cb, void* cb_user_data);
+OPENDHT_C_PUBLIC void dht_runner_cancel_put(dht_runner* runner, const dht_infohash* hash, dht_value_id value_id);
 OPENDHT_C_PUBLIC void dht_runner_shutdown(dht_runner* runner, dht_shutdown_cb done_cb, void* cb_user_data);
 
 #ifdef __cplusplus
-- 
GitLab