taler-mdb

GNU Taler Extensions and Integrations
Log | Files | Refs | Submodules | README | LICENSE

commit b549e5f0b6635dbf533d94b0a7b24bfcd6cc976b
parent 4b62f02405a2315bd38967a08eaa4642d0ddc44c
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sat,  9 Nov 2019 16:31:08 +0100

retry NFC failures more nicely

Diffstat:
Msrc/main.c | 97++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
1 file changed, 54 insertions(+), 43 deletions(-)

diff --git a/src/main.c b/src/main.c @@ -220,6 +220,8 @@ shutdown_task (void *cls) GNUNET_CURL_gnunet_rc_destroy (rc); rc = NULL; } + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Shutdown complete\n"); } @@ -257,9 +259,8 @@ wallet_transmit_uri (void *cls) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to send command\n"); - pa->task = GNUNET_SCHEDULER_add_delayed (NFC_FAILURE_RETRY_FREQ, - &connect_target, - pa); + pa->task = GNUNET_SCHEDULER_add_now (&connect_target, + pa); return; } if (0 != memcmp (response, @@ -270,9 +271,8 @@ wallet_transmit_uri (void *cls) "'PUT DATA' command transmission failed, return code: %x%x\n", response[0], response[1]); - pa->task = GNUNET_SCHEDULER_add_delayed (NFC_FAILURE_RETRY_FREQ, - &connect_target, - pa); + pa->task = GNUNET_SCHEDULER_add_now (&connect_target, + pa); return; } GNUNET_log (GNUNET_ERROR_TYPE_INFO, @@ -306,10 +306,9 @@ wallet_select_aid (void *cls) NFC_TIMEOUT)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to transceive with NFC app, trying to find another NFC client in 1s\n"); - pa->task = GNUNET_SCHEDULER_add_delayed (NFC_FAILURE_RETRY_FREQ, - &connect_target, - pa); + "Failed to transceive with NFC app, trying to find another NFC client\n"); + pa->task = GNUNET_SCHEDULER_add_now (&connect_target, + pa); return; } if (0 == memcmp (response, @@ -323,12 +322,11 @@ wallet_select_aid (void *cls) return; } GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "AID selection failure, return code: %x%x, trying to find another NFC client in 1s\n", + "AID selection failure, return code: %x%x, trying to find another NFC client\n", response[0], response[1]); - pa->task = GNUNET_SCHEDULER_add_delayed (NFC_FAILURE_RETRY_FREQ, - &connect_target, - pa); + pa->task = GNUNET_SCHEDULER_add_now (&connect_target, + pa); } @@ -356,6 +354,7 @@ connect_target (void *cls) pa->nt.nti.nai.szUidLen = 0; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Trying to find NFC client\n"); + /* NOTE: this may block for up to 5s, libnfc API sucks... */ if (0 >= nfc_initiator_select_passive_target (pa->pnd, nmMifare[0], NULL, @@ -383,9 +382,45 @@ connect_target (void *cls) pa); return; } - pa->task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, - &connect_target, - pa); + pa->task = GNUNET_SCHEDULER_add_now (&connect_target, + pa); +} + + +static void +connect_nfc (void *cls) +{ + struct PaymentActivity *pa = cls; + + pa->task = NULL; + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Trying to open NFC device\n"); + pa->pnd = nfc_open (context, NULL); + if (NULL == pa->pnd) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Payment inititation: Unable to open nfc device\n"); + pa->task = GNUNET_SCHEDULER_add_delayed (NFC_FAILURE_RETRY_FREQ, + &connect_nfc, + pa); + return; + } + if (0 > nfc_initiator_init (pa->pnd)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Failed to initialize NFC device: %s", + nfc_strerror (pa->pnd)); + cleanup_payment (pa); + GNUNET_assert (payment_activity == pa); + payment_activity = NULL; + return; + } + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "NFC in operation %s / %s\n", + nfc_device_get_name (pa->pnd), + nfc_device_get_connstring (pa->pnd)); + pa->task = GNUNET_SCHEDULER_add_now (&connect_target, + pa); } @@ -414,10 +449,10 @@ check_payment_cb (void *cls, struct TALER_Amount *refund_amount, const char *taler_pay_uri) { + struct PaymentActivity *pa = cls; (void) refunded; (void) refund_amount; (void) obj; - struct PaymentActivity *pa = cls; pa->cpo = NULL; if (MHD_HTTP_OK != http_status) @@ -450,31 +485,7 @@ check_payment_cb (void *cls, { GNUNET_assert (NULL == pa->pnd); pa->taler_pay_uri = GNUNET_strdup (taler_pay_uri); - pa->pnd = nfc_open (context, NULL); - if (NULL == pa->pnd) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Payment inititation: Unable to open nfc device\n"); - cleanup_payment (pa); - GNUNET_assert (payment_activity == pa); - payment_activity = NULL; - return; - } - if (0 > nfc_initiator_init (pa->pnd)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to initialize NFC device: %s", - nfc_strerror (pa->pnd)); - cleanup_payment (pa); - GNUNET_assert (payment_activity == pa); - payment_activity = NULL; - return; - } - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "NFC in operation %s / %s\n", - nfc_device_get_name (pa->pnd), - nfc_device_get_connstring (pa->pnd)); - pa->task = GNUNET_SCHEDULER_add_now (&connect_target, + pa->task = GNUNET_SCHEDULER_add_now (&connect_nfc, pa); } }