/// <summary> /// Send a message to the Trezor and receive the result /// </summary> /// <typeparam name="TReadMessage">The message type</typeparam> /// <typeparam name="TWriteMessage">The result type</typeparam> /// <param name="message">The message</param> /// <returns>The result</returns> public async Task <TReadMessage> SendMessageAsync <TReadMessage, TWriteMessage>(TWriteMessage message) { ValidateInitialization(message); await _Lock.WaitAsync().ConfigureAwait(false); try { var response = await SendMessageAsync(message).ConfigureAwait(false); for (var i = 0; i < 10; i++) { if (IsPinMatrixRequest(response)) { var pin = await _EnterPinCallback.Invoke().ConfigureAwait(false); response = await PinMatrixAckAsync(pin).ConfigureAwait(false); if (response is TReadMessage readMessage) { return(readMessage); } } if (IsPassphraseRequest(response)) { var passPhrase = await _EnterPassphraseCallback.Invoke().ConfigureAwait(false); response = await PassphraseAckAsync(passPhrase).ConfigureAwait(false); if (response is TReadMessage readMessage) { return(readMessage); } } else if (IsButtonRequest(response)) { response = await ButtonAckAsync().ConfigureAwait(false); if (response is TReadMessage readMessage) { return(readMessage); } } else if (response is TReadMessage readMessage) { return(readMessage); } } throw new ManagerException($"Returned response ({response.GetType().Name}) was of the wrong specified message type ({typeof(TReadMessage).Name}). The user did not accept the message, or pin was entered incorrectly too many times (Note: this library does not have an incorrect pin safety mechanism.)"); } finally { _ = _Lock.Release(); } }
/// <summary> /// Send a message to the Trezor and receive the result /// </summary> /// <typeparam name="TReadMessage">The message type</typeparam> /// <typeparam name="TWriteMessage">The result type</typeparam> /// <param name="message">The message</param> /// <returns>The result</returns> public async Task <TReadMessage> SendMessageAsync <TReadMessage, TWriteMessage>(TWriteMessage message, Action onMessageSending = null) { await _Lock.WaitAsync(); try { var response = await SendMessageAsync(message); for (var i = 0; i < 10; i++) { if (IsPinMatrixRequest(response)) { PinRequest = true; var pin = await _EnterPinCallback.Invoke(); //if (string.IsNullOrEmpty(pin)) // throw new FailureException<Failure>("Invalid Pin ", new Failure() { Message = "Please try again" }); response = await PinMatrixAckAsync(pin); if (response is TReadMessage) { return((TReadMessage)response); } } else if (IsButtonRequest(response)) { PinRequest = false; onMessageSending?.Invoke(); response = await ButtonAckAsync(); if (response is TReadMessage) { return((TReadMessage)response); } } else if (response is TReadMessage) { PinRequest = false; return((TReadMessage)response); } } throw new ManagerException($"Returned response ({response.GetType().Name}) was of the wrong specified message type ({typeof(TReadMessage).Name}). The user did not accept the message, or pin was entered incorrectly too many times (Note: this library does not have an incorrect pin safety mechanism.)"); } finally { _Lock.Release(); } }