From 11f939ff3214d5458890fe8c88c594f6f30784e8 Mon Sep 17 00:00:00 2001 From: Martin Endler Date: Thu, 26 Jan 2017 19:10:48 +0100 Subject: [PATCH] Allow keep trying if SCard service is unavailable --- lib/pcsclite.js | 23 +++++++++++++++-------- src/pcsclite.cpp | 5 +++++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/lib/pcsclite.js b/lib/pcsclite.js index c7668cc..2a1e9dd 100644 --- a/lib/pcsclite.js +++ b/lib/pcsclite.js @@ -10,17 +10,24 @@ inherits(CardReader, EventEmitter); function parseReadersString(buffer) { - const string = buffer.toString().slice(0, -1); + try { - // it looks like - // ACS ACR122U PICC Interface\u0000ACS ACR122U PICC Interface 01\u0000\u0000 - // [reader_name]\u0000[reader_name]\u0000\u0000 - // ^separator ^separator^end_separator + const string = buffer.toString().slice(0, -1); - // returns readers in array - // like [ 'ACS ACR122U PICC Interface', 'ACS ACR122U PICC Interface 01' ] + // it looks like + // ACS ACR122U PICC Interface\u0000ACS ACR122U PICC Interface 01\u0000\u0000 + // [reader_name]\u0000[reader_name]\u0000\u0000 + // ^separator ^separator^end_separator - return string.split('\u0000').slice(0, -1); + // returns readers in array + // like [ 'ACS ACR122U PICC Interface', 'ACS ACR122U PICC Interface 01' ] + + return string.split('\u0000').slice(0, -1); + + } + catch (e) { + return []; + } } diff --git a/src/pcsclite.cpp b/src/pcsclite.cpp index 42d9bbb..757fa5c 100644 --- a/src/pcsclite.cpp +++ b/src/pcsclite.cpp @@ -287,6 +287,11 @@ LONG PCSCLite::get_card_readers(PCSCLite* pcsclite, AsyncResult* async_result) { result = get_card_readers(pcsclite, async_result); } #endif + if (result == SCARD_E_NO_SERVICE || result == SCARD_E_SERVICE_STOPPED) { + SCardReleaseContext(pcsclite->m_card_context); + SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &pcsclite->m_card_context); + result = get_card_readers(pcsclite, async_result); + } } else { /* Store the readers_name in the baton */ async_result->readers_name = readers_name;