diff options
Diffstat (limited to 'impls')
| -rw-r--r-- | impls/monero.dart/lib/monero.dart | 18 | ||||
| -rw-r--r-- | impls/monero.dart/lib/src/generated_bindings_monero.g.dart | 14 | ||||
| -rw-r--r-- | impls/monero.dart/lib/src/ledger.dart | 55 | ||||
| -rw-r--r-- | impls/monero.dart/pubspec.yaml | 3 |
4 files changed, 82 insertions, 8 deletions
diff --git a/impls/monero.dart/lib/monero.dart b/impls/monero.dart/lib/monero.dart index 4fcc970..7b6eac3 100644 --- a/impls/monero.dart/lib/monero.dart +++ b/impls/monero.dart/lib/monero.dart @@ -3607,6 +3607,24 @@ bool WalletManager_verifyWalletPassword( return s; } +int WalletManager_queryWalletDevice( + WalletManager wm_ptr, { + required String keysFileName, + required String password, + required int kdfRounds, + }) { + debugStart?.call('MONERO_WalletManager_queryWalletDevice'); + lib ??= MoneroC(DynamicLibrary.open(libPath)); + final keysFileName_ = keysFileName.toNativeUtf8().cast<Char>(); + final password_ = password.toNativeUtf8().cast<Char>(); + final s = lib!.MONERO_WalletManager_queryWalletDevice( + wm_ptr, keysFileName_, password_, kdfRounds); + calloc.free(keysFileName_); + calloc.free(password_); + debugEnd?.call('MONERO_WalletManager_queryWalletDevice'); + return s; +} + List<String> WalletManager_findWallets(WalletManager wm_ptr, {required String path}) { debugStart?.call('MONERO_WalletManager_findWallets'); diff --git a/impls/monero.dart/lib/src/generated_bindings_monero.g.dart b/impls/monero.dart/lib/src/generated_bindings_monero.g.dart index 039fbf9..cd2124b 100644 --- a/impls/monero.dart/lib/src/generated_bindings_monero.g.dart +++ b/impls/monero.dart/lib/src/generated_bindings_monero.g.dart @@ -4911,14 +4911,14 @@ class MoneroC { bool Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>, bool, int)>(); - bool MONERO_WalletManager_queryWalletDevice( - int device_type, + int MONERO_WalletManager_queryWalletDevice( + ffi.Pointer<ffi.Void> wm_ptr, ffi.Pointer<ffi.Char> keys_file_name, ffi.Pointer<ffi.Char> password, int kdf_rounds, ) { return _MONERO_WalletManager_queryWalletDevice( - device_type, + wm_ptr, keys_file_name, password, kdf_rounds, @@ -4927,15 +4927,15 @@ class MoneroC { late final _MONERO_WalletManager_queryWalletDevicePtr = _lookup< ffi.NativeFunction< - ffi.Bool Function( - ffi.Int, + ffi.Int Function( + ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>, ffi.Uint64)>>('MONERO_WalletManager_queryWalletDevice'); late final _MONERO_WalletManager_queryWalletDevice = _MONERO_WalletManager_queryWalletDevicePtr.asFunction< - bool Function( - int, ffi.Pointer<ffi.Char>, ffi.Pointer<ffi.Char>, int)>(); + int Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>, + ffi.Pointer<ffi.Char>, int)>(); ffi.Pointer<ffi.Char> MONERO_WalletManager_findWallets( ffi.Pointer<ffi.Void> wm_ptr, diff --git a/impls/monero.dart/lib/src/ledger.dart b/impls/monero.dart/lib/src/ledger.dart new file mode 100644 index 0000000..166bcf4 --- /dev/null +++ b/impls/monero.dart/lib/src/ledger.dart @@ -0,0 +1,55 @@ +import 'dart:async'; +import 'dart:ffi'; +import 'dart:typed_data'; + +import 'package:ffi/ffi.dart'; +import 'package:ledger_flutter_plus/ledger_flutter_plus.dart'; +import 'package:monero/monero.dart' as monero; + +Timer? _ledgerExchangeTimer; +String _lastLedgerRequest = ''; + +void enableLedgerExchange(monero.wallet ptr, LedgerConnection connection) { + _ledgerExchangeTimer = Timer.periodic(Duration(milliseconds: 1), (_) async { + final ledgerRequestLength = monero.Wallet_getSendToDeviceLength(ptr); + final ledgerRequest = monero.Wallet_getSendToDevice(ptr) + .cast<Uint8>() + .asTypedList(ledgerRequestLength); + if (ledgerRequestLength > 0 && _lastLedgerRequest != ledgerRequest.join()) { + _lastLedgerRequest = ledgerRequest.join(); + + final response = await exchange(connection, ledgerRequest); + + final Pointer<Uint8> result = malloc<Uint8>(response.length); + for (var i = 0; i < response.length; i++) { + result.asTypedList(response.length)[i] = response[i]; + } + + monero.Wallet_setDeviceReceivedData( + ptr, result.cast<UnsignedChar>(), response.length); + + monero.Wallet_setDeviceSendData( + ptr, malloc<Uint8>(0).cast<UnsignedChar>(), 0); + } + }); +} + +void disableLedgerExchange() { + _ledgerExchangeTimer?.cancel(); +} + +Future<Uint8List> exchange(LedgerConnection connection, Uint8List data) async => + connection.sendOperation<Uint8List>(ExchangeOperation(data)); + +class ExchangeOperation extends LedgerOperation<Uint8List> { + final Uint8List inputData; + + ExchangeOperation(this.inputData); + + @override + Future<Uint8List> read(ByteDataReader reader) async => + reader.read(reader.remainingLength); + + @override + Future<List<Uint8List>> write(ByteDataWriter writer) async => [inputData]; +} diff --git a/impls/monero.dart/pubspec.yaml b/impls/monero.dart/pubspec.yaml index 174a781..577dcbe 100644 --- a/impls/monero.dart/pubspec.yaml +++ b/impls/monero.dart/pubspec.yaml @@ -8,8 +8,9 @@ environment: dependencies: ffi: ^2.1.0 + ledger_flutter_plus: ^1.2.5 dev_dependencies: lints: ^5.0.0 test: ^1.24.0 - ffigen: ^14.0.0
\ No newline at end of file + ffigen: ^14.0.0 |
