From 844326514251e627cd8d8c634a42e43e9c9eddb4 Mon Sep 17 00:00:00 2001 From: Steve Myers Date: Sat, 3 Jul 2021 19:24:29 -0700 Subject: [PATCH] Add FfiResultVoid type --- .../kotlin/org/bitcoindevkit/bdk/LibJna.kt | 25 ++++++++----------- .../org/bitcoindevkit/bdk/types/VoidResult.kt | 10 ++++---- cc/bdk_ffi.h | 18 ++++++------- cc/bdk_ffi_test.c | 17 ++++++------- src/types.rs | 11 ++++++-- src/wallet/mod.rs | 10 +++----- 6 files changed, 43 insertions(+), 48 deletions(-) diff --git a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/LibJna.kt b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/LibJna.kt index 41789c5..f31d346 100644 --- a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/LibJna.kt +++ b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/LibJna.kt @@ -30,27 +30,22 @@ interface LibJna : Library { // typedef struct { // - // int32_t ok; - // // char * err; // - //} FfiResult_int32_t; - open class FfiResult_int32_t : Structure() { - class ByValue : FfiResult_int32_t(), Structure.ByValue - class ByReference : FfiResult_int32_t(), Structure.ByReference - - @JvmField - var ok: Int = 0 + //} FfiResultVoid_t; + open class FfiResultVoid_t : Structure() { + class ByValue : FfiResultVoid_t(), Structure.ByValue + class ByReference : FfiResultVoid_t(), Structure.ByReference @JvmField var err: String = "" - override fun getFieldOrder() = listOf("ok", "err") + override fun getFieldOrder() = listOf("err") } - // void free_int_result ( - // FfiResult_int32_t int_result); - fun free_int_result(void_result: FfiResult_int32_t.ByValue) + // void free_void_result ( + // FfiResultVoid_t void_result); + fun free_void_result(void_result: FfiResultVoid_t.ByValue) // void free_string ( // char * string); @@ -241,9 +236,9 @@ interface LibJna : Library { // FfiResult_Vec_LocalUtxo_t unspent_result); fun free_unspent_result(unspent_result: FfiResultVec_LocalUtxo_t.ByValue) - // FfiResult_int32_t sync_wallet ( + // FfiResultVoid_t sync_wallet ( // OpaqueWallet_t const * opaque_wallet); - fun sync_wallet(opaque_wallet: OpaqueWallet_t): FfiResult_int32_t.ByValue + fun sync_wallet(opaque_wallet: OpaqueWallet_t): FfiResultVoid_t.ByValue // FfiResult_char_ptr_t new_address ( // OpaqueWallet_t const * opaque_wallet); diff --git a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/types/VoidResult.kt b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/types/VoidResult.kt index e3a79af..66071d9 100644 --- a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/types/VoidResult.kt +++ b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/types/VoidResult.kt @@ -7,14 +7,14 @@ import org.bitcoindevkit.bdk.LibJna import org.slf4j.Logger import org.slf4j.LoggerFactory -class VoidResult constructor(private val ffiResultInt32T: LibJna.FfiResult_int32_t.ByValue) : +class VoidResult constructor(private val ffiResultVoidT: LibJna.FfiResultVoid_t.ByValue) : LibBase() { private val log: Logger = LoggerFactory.getLogger(VoidResult::class.java) fun value(): Unit { - val err = ffiResultInt32T.err - //val ok = ffiResultInt32T.ok + val err = ffiResultVoidT.err + when { err.isNotEmpty() -> { log.error("JnaError: $err") @@ -27,7 +27,7 @@ class VoidResult constructor(private val ffiResultInt32T: LibJna.FfiResult_int32 } protected fun finalize() { - libJna.free_int_result(ffiResultInt32T) - log.debug("$ffiResultInt32T freed") + libJna.free_void_result(ffiResultVoidT) + log.debug("$ffiResultVoidT freed") } } \ No newline at end of file diff --git a/cc/bdk_ffi.h b/cc/bdk_ffi.h index 452f0a1..058fe82 100644 --- a/cc/bdk_ffi.h +++ b/cc/bdk_ffi.h @@ -37,19 +37,13 @@ FfiResult_OpaqueWallet_ptr_t new_wallet_result ( void free_wallet_result ( FfiResult_OpaqueWallet_ptr_t wallet_result); - -#include -#include - typedef struct { - int32_t ok; - char * err; -} FfiResult_int32_t; +} FfiResultVoid_t; -FfiResult_int32_t sync_wallet ( +FfiResultVoid_t sync_wallet ( OpaqueWallet_t const * opaque_wallet); typedef struct { @@ -63,6 +57,10 @@ typedef struct { FfiResult_char_ptr_t new_address ( OpaqueWallet_t const * opaque_wallet); + +#include +#include + typedef struct { char * txid; @@ -137,8 +135,8 @@ void free_database_config ( void free_string_result ( FfiResult_char_ptr_t string_result); -void free_int_result ( - FfiResult_int32_t int_result); +void free_void_result ( + FfiResultVoid_t void_result); /** \brief * Free a Rust-allocated string diff --git a/cc/bdk_ffi_test.c b/cc/bdk_ffi_test.c index ce8df5f..99744ce 100644 --- a/cc/bdk_ffi_test.c +++ b/cc/bdk_ffi_test.c @@ -48,10 +48,9 @@ int main (int argc, char const * const argv[]) OpaqueWallet_t *wallet = wallet_result.ok; // sync wallet - FfiResult_int32_t sync_result = sync_wallet(wallet); - assert(sync_result.ok == 0); + FfiResultVoid_t sync_result = sync_wallet(wallet); assert(strlen(sync_result.err) == 0); - free_int_result(sync_result); + free_void_result(sync_result); // new address FfiResult_char_ptr_t address1_result = new_address(wallet); @@ -75,7 +74,7 @@ int main (int argc, char const * const argv[]) //// free_wallet_result(wallet_result); // verify sync_wallet after free_wallet fails (core dumped) - //// FfiResult_int32_t sync_result2 = sync_wallet(wallet); + //// FfiResultVoid_t sync_result2 = sync_wallet(wallet); } // test get unspent utxos @@ -97,10 +96,9 @@ int main (int argc, char const * const argv[]) OpaqueWallet_t *wallet = wallet_result.ok; // sync wallet - FfiResult_int32_t sync_result = sync_wallet(wallet); - assert(sync_result.ok == 0); + FfiResultVoid_t sync_result = sync_wallet(wallet); assert(strlen(sync_result.err) == 0); - free_int_result(sync_result); + free_void_result(sync_result); // list unspent FfiResult_Vec_LocalUtxo_t unspent_result = list_unspent(wallet); @@ -144,10 +142,9 @@ int main (int argc, char const * const argv[]) OpaqueWallet_t *wallet = wallet_result.ok; // sync wallet - FfiResult_int32_t sync_result = sync_wallet(wallet); - assert(sync_result.ok == 0); + FfiResultVoid_t sync_result = sync_wallet(wallet); assert(sync_result.err == NULL); - free_int_result(sync_result); + free_void_result(sync_result); // get balance FfiResultT_uint64_t balance_result = balance(wallet); diff --git a/src/types.rs b/src/types.rs index 1b2254f..c4dd5ac 100644 --- a/src/types.rs +++ b/src/types.rs @@ -9,14 +9,21 @@ pub struct FfiResult { pub err: char_p_boxed, } +#[derive_ReprC] +#[repr(C)] +#[derive(Debug)] +pub struct FfiResultVoid { + pub err: char_p_boxed, +} + #[ffi_export] fn free_string_result(string_result: FfiResult) { drop(string_result) } #[ffi_export] -fn free_int_result(int_result: FfiResult) { - drop(int_result) +fn free_void_result(void_result: FfiResultVoid) { + drop(void_result) } // TODO do we need this? remove? diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index b6b1a1a..bf12321 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -13,7 +13,7 @@ use blockchain::BlockchainConfig; use database::DatabaseConfig; use crate::error::get_name; -use crate::types::FfiResult; +use crate::types::{FfiResult, FfiResultVoid}; use std::ffi::CString; mod blockchain; @@ -77,15 +77,13 @@ fn free_wallet_result(wallet_result: FfiResult>>) { // wallet operations #[ffi_export] -fn sync_wallet(opaque_wallet: &OpaqueWallet) -> FfiResult { +fn sync_wallet(opaque_wallet: &OpaqueWallet) -> FfiResultVoid { let int_result = opaque_wallet.raw.sync(log_progress(), Some(100)); match int_result { - Ok(_v) => FfiResult { - ok: 0, + Ok(_v) => FfiResultVoid { err: char_p_boxed::from(CString::default()), }, - Err(e) => FfiResult { - ok: -1, + Err(e) => FfiResultVoid { err: char_p_boxed::try_from(get_name(&e)).unwrap(), }, }