Skip to content
Snippets Groups Projects
Commit 0eee567c authored by Adrien Béraud's avatar Adrien Béraud
Browse files

c wrapper: add support to create, ref/unref dht_value

parent e8843076
Branches
Tags
No related merge requests found
#include "opendht_c.h" #include "opendht_c.h"
#include "opendht.h" #include "opendht.h"
using ValueSp = std::shared_ptr<dht::Value>;
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
...@@ -11,11 +13,19 @@ const char* dht_infohash_print(const dht_infohash* h) ...@@ -11,11 +13,19 @@ const char* dht_infohash_print(const dht_infohash* h)
return reinterpret_cast<const dht::InfoHash*>(h)->to_c_str(); return reinterpret_cast<const dht::InfoHash*>(h)->to_c_str();
} }
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(); *reinterpret_cast<dht::InfoHash*>(h) = dht::InfoHash::getRandom();
} }
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(); return reinterpret_cast<const dht::PkId*>(h)->to_c_str();
...@@ -38,12 +48,25 @@ dht_data_view dht_blob_get_data(const dht_blob* data) ...@@ -38,12 +48,25 @@ dht_data_view dht_blob_get_data(const dht_blob* data)
// dht::Value // 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; dht_data_view view;
view.data = reinterpret_cast<const dht::Value*>(data)->data.data(); view.data = vsp->data.data();
view.size = reinterpret_cast<const dht::Value*>(data)->data.size(); view.size = vsp->data.size();
return view; return view;
} }
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)));
}
dht_value* dht_value_ref(const dht_value* v) {
return reinterpret_cast<dht_value*>(new ValueSp(*reinterpret_cast<const ValueSp*>(v)));
}
void dht_value_unref(dht_value* v) {
delete reinterpret_cast<ValueSp*>(v);
}
// dht::crypto::PublicKey // dht::crypto::PublicKey
dht_publickey* dht_publickey_new() { dht_publickey* dht_publickey_new() {
return reinterpret_cast<dht_publickey*>(new dht::crypto::PublicKey); return reinterpret_cast<dht_publickey*>(new dht::crypto::PublicKey);
...@@ -140,7 +163,7 @@ void dht_runner_get(dht_runner* r, const dht_infohash* h, dht_get_cb cb, dht_don ...@@ -140,7 +163,7 @@ void dht_runner_get(dht_runner* r, const dht_infohash* h, dht_get_cb cb, dht_don
auto runner = reinterpret_cast<dht::DhtRunner*>(r); auto runner = reinterpret_cast<dht::DhtRunner*>(r);
auto hash = reinterpret_cast<const dht::InfoHash*>(h); auto hash = reinterpret_cast<const dht::InfoHash*>(h);
runner->get(*hash, [cb,cb_user_data](std::shared_ptr<dht::Value> value){ runner->get(*hash, [cb,cb_user_data](std::shared_ptr<dht::Value> value){
return cb(reinterpret_cast<dht_value*>(value.get()), cb_user_data); return cb(reinterpret_cast<const dht_value*>(&value), cb_user_data);
}, [done_cb, cb_user_data](bool ok){ }, [done_cb, cb_user_data](bool ok){
done_cb(ok, cb_user_data); done_cb(ok, cb_user_data);
}); });
...@@ -153,7 +176,7 @@ dht_op_token* dht_runner_listen(dht_runner* r, const dht_infohash* h, dht_value_ ...@@ -153,7 +176,7 @@ dht_op_token* dht_runner_listen(dht_runner* r, const dht_infohash* h, dht_value_
auto fret = new std::future<size_t>; auto fret = new std::future<size_t>;
*fret = runner->listen(*hash, [cb,cb_user_data](const std::vector<std::shared_ptr<dht::Value>>& values, bool expired) { *fret = runner->listen(*hash, [cb,cb_user_data](const std::vector<std::shared_ptr<dht::Value>>& values, bool expired) {
for (const auto& value : values) { for (const auto& value : values) {
if (not cb(reinterpret_cast<dht_value*>(value.get()), expired, cb_user_data)) if (not cb(reinterpret_cast<const dht_value*>(&value), expired, cb_user_data))
return false; return false;
} }
return true; return true;
...@@ -161,8 +184,7 @@ dht_op_token* dht_runner_listen(dht_runner* r, const dht_infohash* h, dht_value_ ...@@ -161,8 +184,7 @@ dht_op_token* dht_runner_listen(dht_runner* r, const dht_infohash* h, dht_value_
return (dht_op_token*)fret; return (dht_op_token*)fret;
} }
void void dht_runner_cancel_listen(dht_runner* r, const dht_infohash* h, dht_op_token* t)
dht_runner_cancel_listen(dht_runner* r, const dht_infohash* h, dht_op_token* t)
{ {
auto runner = reinterpret_cast<dht::DhtRunner*>(r); auto runner = reinterpret_cast<dht::DhtRunner*>(r);
auto hash = reinterpret_cast<const dht::InfoHash*>(h); auto hash = reinterpret_cast<const dht::InfoHash*>(h);
...@@ -170,6 +192,14 @@ dht_runner_cancel_listen(dht_runner* r, const dht_infohash* h, dht_op_token* t) ...@@ -170,6 +192,14 @@ dht_runner_cancel_listen(dht_runner* r, const dht_infohash* h, dht_op_token* t)
runner->cancelListen(*hash, std::move(*token)); runner->cancelListen(*hash, std::move(*token));
} }
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](){
done_cb(cb_user_data);
});
}
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
...@@ -22,6 +22,9 @@ typedef struct dht_data_view dht_data_view; ...@@ -22,6 +22,9 @@ typedef struct dht_data_view dht_data_view;
struct OPENDHT_C_PUBLIC dht_value; struct OPENDHT_C_PUBLIC dht_value;
typedef struct dht_value dht_value; typedef struct dht_value dht_value;
OPENDHT_C_PUBLIC dht_data_view dht_value_get_data(const dht_value* data); OPENDHT_C_PUBLIC dht_data_view dht_value_get_data(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*);
// dht::Blob // dht::Blob
struct OPENDHT_C_PUBLIC dht_blob; struct OPENDHT_C_PUBLIC dht_blob;
...@@ -32,8 +35,10 @@ OPENDHT_C_PUBLIC void dht_blob_delete(dht_blob* data); ...@@ -32,8 +35,10 @@ OPENDHT_C_PUBLIC void dht_blob_delete(dht_blob* data);
// dht::InfoHash // dht::InfoHash
struct OPENDHT_C_PUBLIC dht_infohash { uint8_t d[HASH_LEN]; }; struct OPENDHT_C_PUBLIC dht_infohash { uint8_t d[HASH_LEN]; };
typedef struct dht_infohash dht_infohash; typedef struct dht_infohash dht_infohash;
OPENDHT_C_PUBLIC void dht_infohash_zero(dht_infohash* h);
OPENDHT_C_PUBLIC void dht_infohash_random(dht_infohash* h); OPENDHT_C_PUBLIC void dht_infohash_random(dht_infohash* h);
OPENDHT_C_PUBLIC const char* dht_infohash_print(const dht_infohash* h); OPENDHT_C_PUBLIC const char* dht_infohash_print(const dht_infohash* h);
OPENDHT_C_PUBLIC bool dht_infohash_is_zero(const dht_infohash* h);
// dht::PkId // dht::PkId
struct OPENDHT_C_PUBLIC dht_pkid { uint8_t d[32]; }; struct OPENDHT_C_PUBLIC dht_pkid { uint8_t d[32]; };
...@@ -46,7 +51,7 @@ typedef struct dht_publickey dht_publickey; ...@@ -46,7 +51,7 @@ typedef struct dht_publickey dht_publickey;
OPENDHT_C_PUBLIC dht_publickey* dht_publickey_new(); OPENDHT_C_PUBLIC dht_publickey* dht_publickey_new();
OPENDHT_C_PUBLIC void dht_publickey_delete(dht_publickey* pk); OPENDHT_C_PUBLIC void dht_publickey_delete(dht_publickey* pk);
OPENDHT_C_PUBLIC int dht_publickey_unpack(dht_publickey* pk, const uint8_t* dat, size_t dat_size); OPENDHT_C_PUBLIC int dht_publickey_unpack(dht_publickey* pk, const uint8_t* dat, size_t dat_size);
OPENDHT_C_PUBLIC int dht_publickey_pack(dht_publickey* pk, char* out, size_t* outlen); OPENDHT_C_PUBLIC int dht_publickey_pack(dht_publickey* pk, char* out, size_t* out_size);
OPENDHT_C_PUBLIC dht_infohash dht_publickey_get_id(const dht_publickey* pk); OPENDHT_C_PUBLIC dht_infohash dht_publickey_get_id(const dht_publickey* pk);
OPENDHT_C_PUBLIC dht_pkid dht_publickey_get_long_id(const dht_publickey* pk); OPENDHT_C_PUBLIC dht_pkid dht_publickey_get_long_id(const dht_publickey* pk);
OPENDHT_C_PUBLIC bool dht_publickey_check_signature(const dht_publickey* pk, const char* data, size_t data_size, const char* signature, size_t signature_size); OPENDHT_C_PUBLIC bool dht_publickey_check_signature(const dht_publickey* pk, const char* data, size_t data_size, const char* signature, size_t signature_size);
...@@ -84,6 +89,7 @@ OPENDHT_C_PUBLIC void dht_runner_bootstrap(dht_runner* runner, const char* host, ...@@ -84,6 +89,7 @@ OPENDHT_C_PUBLIC void dht_runner_bootstrap(dht_runner* runner, const char* host,
OPENDHT_C_PUBLIC void dht_runner_get(dht_runner* runner, const dht_infohash* hash, dht_get_cb cb, dht_done_cb done_cb, void* cb_user_data); OPENDHT_C_PUBLIC void dht_runner_get(dht_runner* runner, const dht_infohash* hash, dht_get_cb cb, dht_done_cb done_cb, void* cb_user_data);
OPENDHT_C_PUBLIC dht_op_token* dht_runner_listen(dht_runner* runner, const dht_infohash* hash, dht_value_cb cb, void* cb_user_data); OPENDHT_C_PUBLIC dht_op_token* dht_runner_listen(dht_runner* runner, const dht_infohash* hash, dht_value_cb 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_cancel_listen(dht_runner* runner, const dht_infohash* hash, dht_op_token* token);
OPENDHT_C_PUBLIC void dht_runner_shutdown(dht_runner* runner, dht_shutdown_cb done_cb, void* cb_user_data);
#ifdef __cplusplus #ifdef __cplusplus
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment