src: improve reader status reporting logic
- Avoid sending twice the same status. - Discard SCARD_E_UNKNOWN_READER error as it's happening when the reader is disconnected and the disconnection will be detected by the pcsclite.cpp status thread.
This commit is contained in:
@@ -340,9 +340,10 @@ void CardReader::HandleReaderStatusChange(uv_async_t *handle, int status) {
|
|||||||
if (reader->m_state == 1) {
|
if (reader->m_state == 1) {
|
||||||
// Swallow events : Listening thread was cancelled by user.
|
// Swallow events : Listening thread was cancelled by user.
|
||||||
} else if ((ar->result == SCARD_S_SUCCESS) ||
|
} else if ((ar->result == SCARD_S_SUCCESS) ||
|
||||||
(ar->result == (LONG)SCARD_E_NO_READERS_AVAILABLE)) { // Card reader was unplugged, it's not an error
|
(ar->result == (LONG)SCARD_E_NO_READERS_AVAILABLE) ||
|
||||||
if (ar->result == SCARD_S_SUCCESS) {
|
(ar->result == (LONG)SCARD_E_UNKNOWN_READER)) { // Card reader was unplugged, it's not an error
|
||||||
const unsigned argc = 3;
|
if (ar->status != 0) {
|
||||||
|
const unsigned int argc = 3;
|
||||||
Local<Value> argv[argc] = {
|
Local<Value> argv[argc] = {
|
||||||
Nan::Undefined(), // argument
|
Nan::Undefined(), // argument
|
||||||
Nan::New<Number>(ar->status),
|
Nan::New<Number>(ar->status),
|
||||||
@@ -350,14 +351,14 @@ void CardReader::HandleReaderStatusChange(uv_async_t *handle, int status) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv);
|
Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Local<Value> err = Nan::Error(error_msg("SCardGetStatusChange", ar->result).c_str());
|
Local<Value> err = Nan::Error(error_msg("SCardGetStatusChange", ar->result).c_str());
|
||||||
// Prepare the parameters for the callback function.
|
// Prepare the parameters for the callback function.
|
||||||
const unsigned argc = 1;
|
const unsigned int argc = 1;
|
||||||
Local<Value> argv[argc] = { err };
|
Local<Value> argv[argc] = { err };
|
||||||
Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv);
|
Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (ar->do_exit) {
|
if (ar->do_exit) {
|
||||||
uv_close(reinterpret_cast<uv_handle_t*>(&async_baton->async), CloseCallback); // necessary otherwise UV will block
|
uv_close(reinterpret_cast<uv_handle_t*>(&async_baton->async), CloseCallback); // necessary otherwise UV will block
|
||||||
@@ -403,7 +404,11 @@ void CardReader::HandlerFunction(void* arg) {
|
|||||||
|
|
||||||
async_baton->async_result->do_exit = (reader->m_state != 0);
|
async_baton->async_result->do_exit = (reader->m_state != 0);
|
||||||
async_baton->async_result->result = result;
|
async_baton->async_result->result = result;
|
||||||
|
if (card_reader_state.dwEventState == card_reader_state.dwCurrentState) {
|
||||||
|
async_baton->async_result->status = 0;
|
||||||
|
} else {
|
||||||
async_baton->async_result->status = card_reader_state.dwEventState;
|
async_baton->async_result->status = card_reader_state.dwEventState;
|
||||||
|
}
|
||||||
memcpy(async_baton->async_result->atr, card_reader_state.rgbAtr, card_reader_state.cbAtr);
|
memcpy(async_baton->async_result->atr, card_reader_state.rgbAtr, card_reader_state.cbAtr);
|
||||||
async_baton->async_result->atrlen = card_reader_state.cbAtr;
|
async_baton->async_result->atrlen = card_reader_state.cbAtr;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user