summaryrefslogtreecommitdiff
path: root/impls/monero.dart/lib/src/ledger.dart
diff options
context:
space:
mode:
Diffstat (limited to 'impls/monero.dart/lib/src/ledger.dart')
-rw-r--r--impls/monero.dart/lib/src/ledger.dart55
1 files changed, 55 insertions, 0 deletions
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];
+}