CardReader status event should return the ATR
- Of the inserted card. - Refactoring of the code that creates a Buffer instance into a separate function. - Update the example and README - It fixes bug #2
This commit is contained in:
@@ -33,11 +33,11 @@ Example
|
|||||||
reader.on('status', function(status) {
|
reader.on('status', function(status) {
|
||||||
console.log('Status(', this.name, '):', status);
|
console.log('Status(', this.name, '):', status);
|
||||||
/* check what has changed */
|
/* check what has changed */
|
||||||
var changes = this.status ^ status;
|
var changes = this.state ^ status.state;
|
||||||
if (changes) {
|
if (changes) {
|
||||||
if ((changes & this.SCARD_STATE_EMPTY) && (status & this.SCARD_STATE_EMPTY)) {
|
if ((changes & this.SCARD_STATE_EMPTY) && (status.state & this.SCARD_STATE_EMPTY)) {
|
||||||
console.log("card removed");/* card removed */
|
console.log("card removed");/* card removed */
|
||||||
} else if ((changes & this.SCARD_STATE_PRESENT) && (status & this.SCARD_STATE_PRESENT)) {
|
} else if ((changes & this.SCARD_STATE_PRESENT) && (status.state & this.SCARD_STATE_PRESENT)) {
|
||||||
console.log("card inserted");/* card inserted */
|
console.log("card inserted");/* card inserted */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ pcsc.on('reader', function(reader) {
|
|||||||
reader.on('status', function(status) {
|
reader.on('status', function(status) {
|
||||||
console.log('Status(', this.name, '):', status);
|
console.log('Status(', this.name, '):', status);
|
||||||
/* check what has changed */
|
/* check what has changed */
|
||||||
var changes = this.status ^ status;
|
var changes = this.state ^ status.state;
|
||||||
if (changes) {
|
if (changes) {
|
||||||
if ((changes & this.SCARD_STATE_EMPTY) && (status & this.SCARD_STATE_EMPTY)) {
|
if ((changes & this.SCARD_STATE_EMPTY) && (status.state & this.SCARD_STATE_EMPTY)) {
|
||||||
console.log("card removed");/* card removed */
|
console.log("card removed");/* card removed */
|
||||||
} else if ((changes & this.SCARD_STATE_PRESENT) && (status & this.SCARD_STATE_PRESENT)) {
|
} else if ((changes & this.SCARD_STATE_PRESENT) && (status.state & this.SCARD_STATE_PRESENT)) {
|
||||||
console.log("card inserted");/* card inserted */
|
console.log("card inserted");/* card inserted */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,12 +36,17 @@ module.exports = function() {
|
|||||||
var r = new CardReader(name);
|
var r = new CardReader(name);
|
||||||
readers_aux.push(r);
|
readers_aux.push(r);
|
||||||
p.emit('reader', r);
|
p.emit('reader', r);
|
||||||
r.get_status(function(e, status) {
|
r.get_status(function(e, state, atr) {
|
||||||
if (e) {
|
if (e) {
|
||||||
r.emit('error', e);
|
r.emit('error', e);
|
||||||
} else {
|
} else {
|
||||||
|
var status = { state : state };
|
||||||
|
if (atr) {
|
||||||
|
status.atr = atr;
|
||||||
|
}
|
||||||
|
|
||||||
r.emit('status', status);
|
r.emit('status', status);
|
||||||
r.status = status;
|
r.state = state;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -225,10 +225,11 @@ void CardReader::HandleReaderStatusChange(uv_async_t *handle, int status) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ar->result == SCARD_S_SUCCESS) {
|
if (ar->result == SCARD_S_SUCCESS) {
|
||||||
const unsigned argc = 2;
|
const unsigned argc = 3;
|
||||||
Handle<Value> argv[argc] = {
|
Handle<Value> argv[argc] = {
|
||||||
Undefined(), // argument
|
Undefined(), // argument
|
||||||
Integer::New(ar->status)
|
Integer::New(ar->status),
|
||||||
|
CreateBufferInstance(reinterpret_cast<char*>(ar->atr), ar->atrlen)
|
||||||
};
|
};
|
||||||
|
|
||||||
PerformCallback(async_baton->reader->handle_, async_baton->callback, argc, argv);
|
PerformCallback(async_baton->reader->handle_, async_baton->callback, argc, argv);
|
||||||
@@ -264,6 +265,8 @@ void* CardReader::HandlerFunction(void* arg) {
|
|||||||
result = SCardGetStatusChange(reader->m_status_card_context, INFINITE, &card_reader_state, 1);
|
result = SCardGetStatusChange(reader->m_status_card_context, INFINITE, &card_reader_state, 1);
|
||||||
async_baton->async_result->result = result;
|
async_baton->async_result->result = result;
|
||||||
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);
|
||||||
|
async_baton->async_result->atrlen = card_reader_state.cbAtr;
|
||||||
uv_async_send(&async_baton->async);
|
uv_async_send(&async_baton->async);
|
||||||
card_reader_state.dwCurrentState = card_reader_state.dwEventState;
|
card_reader_state.dwCurrentState = card_reader_state.dwEventState;
|
||||||
}
|
}
|
||||||
@@ -433,16 +436,9 @@ void CardReader::AfterTransmit(uv_work_t* req) {
|
|||||||
PerformCallback(baton->reader->handle_, baton->callback, argc, argv);
|
PerformCallback(baton->reader->handle_, baton->callback, argc, argv);
|
||||||
} else {
|
} else {
|
||||||
const unsigned argc = 2;
|
const unsigned argc = 2;
|
||||||
// get Buffer from global scope.
|
|
||||||
Local<Object> global = v8::Context::GetCurrent()->Global();
|
|
||||||
Local<Value> bv = global->Get(String::NewSymbol("Buffer"));
|
|
||||||
assert(bv->IsFunction());
|
|
||||||
Local<Function> b = Local<Function>::Cast(bv);
|
|
||||||
Handle<Value> argv1[3] = { Buffer::New(reinterpret_cast<char*>(tr->data), tr->len)->handle_, Integer::New(tr->len) , Integer::New(0) };
|
|
||||||
Handle<Object> instance = b->NewInstance(3, argv1);
|
|
||||||
Handle<Value> argv[argc] = {
|
Handle<Value> argv[argc] = {
|
||||||
Local<Value>::New(Null()),
|
Local<Value>::New(Null()),
|
||||||
instance
|
CreateBufferInstance(reinterpret_cast<char*>(tr->data), tr->len)
|
||||||
};
|
};
|
||||||
|
|
||||||
PerformCallback(baton->reader->handle_, baton->callback, argc, argv);
|
PerformCallback(baton->reader->handle_, baton->callback, argc, argv);
|
||||||
@@ -468,3 +464,22 @@ void CardReader::CloseCallback(uv_handle_t *handle) {
|
|||||||
SCardReleaseContext(async_baton->reader->m_status_card_context);
|
SCardReleaseContext(async_baton->reader->m_status_card_context);
|
||||||
delete async_baton;
|
delete async_baton;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Handle<Value> CardReader::CreateBufferInstance(char* data, unsigned long size) {
|
||||||
|
if (size == 0) {
|
||||||
|
return Undefined();
|
||||||
|
}
|
||||||
|
|
||||||
|
// get Buffer from global scope.
|
||||||
|
Local<Object> global = Context::GetCurrent()->Global();
|
||||||
|
Local<Value> bv = global->Get(String::NewSymbol("Buffer"));
|
||||||
|
assert(bv->IsFunction());
|
||||||
|
Local<Function> b = Local<Function>::Cast(bv);
|
||||||
|
Handle<Value> argv[3] = {
|
||||||
|
Buffer::New(data, size)->handle_,
|
||||||
|
Integer::New(size),
|
||||||
|
Integer::New(0)
|
||||||
|
};
|
||||||
|
|
||||||
|
return b->NewInstance(3, argv);
|
||||||
|
}
|
||||||
@@ -41,6 +41,8 @@ class CardReader: public node::ObjectWrap {
|
|||||||
struct AsyncResult {
|
struct AsyncResult {
|
||||||
LONG result;
|
LONG result;
|
||||||
unsigned long status;
|
unsigned long status;
|
||||||
|
unsigned char atr[MAX_ATR_SIZE];
|
||||||
|
unsigned long atrlen;
|
||||||
bool do_exit;
|
bool do_exit;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -80,6 +82,8 @@ class CardReader: public node::ObjectWrap {
|
|||||||
static void AfterTransmit(uv_work_t* req);
|
static void AfterTransmit(uv_work_t* req);
|
||||||
static void CloseCallback(uv_handle_t *handle);
|
static void CloseCallback(uv_handle_t *handle);
|
||||||
|
|
||||||
|
static v8::Handle<v8::Value> CreateBufferInstance(char* data, unsigned long size);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
SCARDCONTEXT m_card_context;
|
SCARDCONTEXT m_card_context;
|
||||||
|
|||||||
Reference in New Issue
Block a user