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:
Santiago Gimeno
2015-12-22 14:56:48 +01:00
parent 0bcf3d8436
commit 57a74befbe

View File

@@ -340,23 +340,24 @@ 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),
Nan::CopyBuffer(reinterpret_cast<char*>(ar->atr), ar->atrlen).ToLocalChecked() Nan::CopyBuffer(reinterpret_cast<char*>(ar->atr), ar->atrlen).ToLocalChecked()
}; };
Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv);
} else {
Local<Value> err = Nan::Error(error_msg("SCardGetStatusChange", ar->result).c_str());
// Prepare the parameters for the callback function.
const unsigned argc = 1;
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);
} }
} else {
Local<Value> err = Nan::Error(error_msg("SCardGetStatusChange", ar->result).c_str());
// Prepare the parameters for the callback function.
const unsigned int argc = 1;
Local<Value> argv[argc] = { err };
Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv);
} }
if (ar->do_exit) { if (ar->do_exit) {
@@ -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;
async_baton->async_result->status = card_reader_state.dwEventState; 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;
}
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;