Add classes to wrap LibJna native types

This commit is contained in:
Steve Myers
2021-06-21 17:01:53 -07:00
parent 90c4fd3328
commit d248bca299
13 changed files with 291 additions and 237 deletions

View File

@@ -0,0 +1,43 @@
package org.bitcoindevkit.bdk
enum class Error {
InvalidU32Bytes,
Generic,
ScriptDoesntHaveAddressForm,
SingleRecipientMultipleOutputs,
SingleRecipientNoInputs,
NoRecipients,
NoUtxosSelected,
OutputBelowDustLimit,
InsufficientFunds,
BnBTotalTriesExceeded,
BnBNoExactMatch,
UnknownUtxo,
TransactionNotFound,
TransactionConfirmed,
IrreplaceableTransaction,
FeeRateTooLow,
FeeTooLow,
MissingKeyOrigin,
Key,
ChecksumMismatch,
SpendingPolicyRequired,
InvalidPolicyPathError,
Signer,
InvalidProgressValue,
ProgressUpdateError,
InvalidOutpoint,
Descriptor,
AddressValidator,
Encode,
Miniscript,
Bip32,
Secp256k1,
Json,
Hex,
Psbt,
Electrum,
// Esplora
// CompactFilters
Sled,
}

View File

@@ -35,10 +35,16 @@ interface LibJna : Library {
// void free_string_result (
// StringResult_t * string_result);
fun free_string_result(string_result: StringResult_t)
// void free_string (
// char * string);
fun free_string(string: Pointer?)
// typedef struct WalletRef WalletRef_t;
class WalletRef_t : PointerType {
constructor() : super()
constructor(pointer: Pointer) : super(pointer)
}
// void free_wallet_ref (
// WalletRef_t * wallet_ref);
fun free_wallet_ref(wallet_ref: WalletRef_t)
// typedef struct WalletResult WalletResult_t;
class WalletResult_t : PointerType {
@@ -58,17 +64,25 @@ interface LibJna : Library {
// char * get_wallet_err (
// WalletResult_t const * wallet_result);
// TODO
fun get_wallet_err(wallet_result: WalletResult_t): Pointer?
// WalletRef_t * get_wallet_ok (
// WalletResult_t const * wallet_result);
fun get_wallet_ok(wallet_result: WalletResult_t): WalletRef_t?
// VoidResult_t * sync_wallet (
// WalletResult_t const * wallet_result);
fun sync_wallet(wallet_result: WalletResult_t): VoidResult_t
// WalletRef_t const * wallet_ref);
fun sync_wallet(wallet_ref: Pointer): VoidResult_t
// StringResult_t * new_address (
// WalletResult_t const * wallet_result);
fun new_address(wallet_result: WalletResult_t): StringResult_t
// WalletRef_t const * wallet_ref);
fun new_address(wallet_ref: Pointer): StringResult_t
// void free_wallet_result (
// WalletResult_t * wallet_result);
fun free_wallet_result(wallet_result: WalletResult_t)
// void free_string (
// char * string);
fun free_string(string: Pointer?)
}

View File

@@ -0,0 +1,32 @@
package org.bitcoindevkit.bdk
import org.slf4j.Logger
import org.slf4j.LoggerFactory
class StringResult internal constructor(private val stringResultT: LibJna.StringResult_t) : LibBase() {
private val log: Logger = LoggerFactory.getLogger(StringResult::class.java)
fun isErr(): Boolean {
return libJna.get_string_err(stringResultT) != null
}
fun err(): String? {
val errPointer = libJna.get_string_err(stringResultT)
val err = errPointer?.getString(0)
libJna.free_string(errPointer)
return err
}
fun ok(): String? {
val okPointer = libJna.get_string_ok(stringResultT)
val ok = okPointer?.getString(0)
libJna.free_string(okPointer)
return ok
}
protected fun finalize() {
libJna.free_string_result(stringResultT)
log.debug("StringResult_t freed")
}
}

View File

@@ -0,0 +1,25 @@
package org.bitcoindevkit.bdk
import org.slf4j.Logger
import org.slf4j.LoggerFactory
class VoidResult internal constructor(private val voidResultT: LibJna.VoidResult_t) : LibBase() {
private val log: Logger = LoggerFactory.getLogger(VoidResult::class.java)
fun isErr(): Boolean {
return libJna.get_void_err(voidResultT) != null
}
fun err(): String? {
val errPointer = libJna.get_void_err(voidResultT)
val err = errPointer?.getString(0)
libJna.free_string(errPointer)
return err
}
protected fun finalize() {
libJna.free_void_result(voidResultT)
log.debug("VoidResult_t freed")
}
}

View File

@@ -0,0 +1,25 @@
package org.bitcoindevkit.bdk
import org.slf4j.Logger
import org.slf4j.LoggerFactory
class Wallet internal constructor(
private val walletRefT: LibJna.WalletRef_t,
) : LibBase() {
private val log: Logger = LoggerFactory.getLogger(Wallet::class.java)
fun sync(): VoidResult {
return VoidResult(libJna.sync_wallet(walletRefT.pointer))
}
fun getAddress(): StringResult {
return StringResult(libJna.new_address(walletRefT.pointer))
}
protected fun finalize() {
libJna.free_wallet_ref(walletRefT)
log.debug("WalletRef_t freed")
}
}

View File

@@ -0,0 +1,36 @@
package org.bitcoindevkit.bdk
import org.slf4j.Logger
import org.slf4j.LoggerFactory
class WalletResult(
name: String,
descriptor: String,
changeDescriptor: String?,
) : LibBase() {
private val log: Logger = LoggerFactory.getLogger(WalletResult::class.java)
private val walletResultT = libJna.new_wallet_result(name, descriptor, changeDescriptor)
fun isErr(): Boolean {
return libJna.get_wallet_err(walletResultT) != null
}
fun err(): String? {
val errPointer = libJna.get_wallet_err(walletResultT)
val err = errPointer?.getString(0)
libJna.free_string(errPointer)
return err
}
fun ok(): Wallet? {
val okWalletRef = libJna.get_wallet_ok(walletResultT)
return if (okWalletRef != null) Wallet(okWalletRef) else null
}
protected fun finalize() {
libJna.free_wallet_result(walletResultT)
log.debug("WalletResult_t freed")
}
}