diff --git a/README.md b/README.md index dc10a12..3227fd0 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ pcsc.on('reader', function(reader) { if (changes) { if ((changes & this.SCARD_STATE_EMPTY) && (status.state & this.SCARD_STATE_EMPTY)) { console.log("card removed");/* card removed */ - reader.disconnect(function(err) { + reader.disconnect(reader.SCARD_LEAVE_CARD, function(err) { if (err) { console.log(err); } else { @@ -124,8 +124,9 @@ Emitted whenever the status of the reader changes. Wrapper around [`SCardConnect`](http://pcsclite.alioth.debian.org/pcsc-lite/node12.html). Establishes a connection to the reader. -#### reader.disconnect(callback) +#### reader.disconnect(disposition, callback) +* *disposition* `Number`. Reader function to execute. Defaults to `SCARD_UNPOWER_CARD` * *callback* `Function` called when disconnection operation ends * *error* `Error` diff --git a/examples/example.js b/examples/example.js index 12ed427..5f4883d 100644 --- a/examples/example.js +++ b/examples/example.js @@ -16,7 +16,7 @@ pcsc.on('reader', function(reader) { if (changes) { if ((changes & this.SCARD_STATE_EMPTY) && (status.state & this.SCARD_STATE_EMPTY)) { console.log("card removed");/* card removed */ - reader.disconnect(function(err) { + reader.disconnect(reader.SCARD_LEAVE_CARD, function(err) { if (err) { console.log(err); } else { diff --git a/lib/pcsclite.js b/lib/pcsclite.js index 4e516f6..c5ee0c9 100644 --- a/lib/pcsclite.js +++ b/lib/pcsclite.js @@ -84,10 +84,18 @@ CardReader.prototype.connect = function(options, cb) { } }; -CardReader.prototype.disconnect = function(cb) { +CardReader.prototype.disconnect = function(disposition, cb) { + if (typeof disposition === 'function') { + cb = disposition; + disposition = undefined; + } + + if (typeof disposition !== 'number') { + disposition = this.SCARD_UNPOWER_CARD; + } if (this.connected) { - this._disconnect(cb); + this._disconnect(disposition, cb); } else { cb(); } diff --git a/src/cardreader.cpp b/src/cardreader.cpp index 2edf96c..d8ba4bd 100644 --- a/src/cardreader.cpp +++ b/src/cardreader.cpp @@ -48,6 +48,12 @@ void CardReader::init(Handle target) { NanSetPrototypeTemplate(tpl, "SCARD_STATE_INUSE", NanNew(SCARD_STATE_INUSE)); NanSetPrototypeTemplate(tpl, "SCARD_STATE_MUTE", NanNew(SCARD_STATE_MUTE)); + // Disconnect disposition + NanSetPrototypeTemplate(tpl, "SCARD_LEAVE_CARD", NanNew(SCARD_LEAVE_CARD)); + NanSetPrototypeTemplate(tpl, "SCARD_RESET_CARD", NanNew(SCARD_RESET_CARD)); + NanSetPrototypeTemplate(tpl, "SCARD_STATE_CHANGED", NanNew(SCARD_STATE_CHANGED)); + NanSetPrototypeTemplate(tpl, "SCARD_UNPOWER_CARD", NanNew(SCARD_UNPOWER_CARD)); + NanAssignPersistent(constructor, tpl->GetFunction()); target->Set(NanNew("CardReader"), tpl->GetFunction()); } @@ -148,14 +154,20 @@ NAN_METHOD(CardReader::Disconnect) { NanScope(); - if (!args[0]->IsFunction()) { - NanThrowError("First argument must be a callback function"); + if (!args[0]->IsUint32()) { + NanThrowError("First argument must be an integer"); } - Local cb = Local::Cast(args[0]); + if (!args[1]->IsFunction()) { + NanThrowError("Second argument must be a callback function"); + } + + DWORD disposition = args[0]->Uint32Value(); + Local cb = Local::Cast(args[1]); // This creates our work request, including the libuv struct. Baton* baton = new Baton(); + baton->input = reinterpret_cast(disposition); baton->request.data = baton; NanAssignPersistent(baton->callback, cb); baton->reader = ObjectWrap::Unwrap(args.This()); @@ -437,6 +449,7 @@ void CardReader::AfterConnect(uv_work_t* req, int status) { void CardReader::DoDisconnect(uv_work_t* req) { Baton* baton = static_cast(req->data); + DWORD disposition = reinterpret_cast(baton->input); LONG result = SCARD_S_SUCCESS; CardReader* obj = baton->reader; @@ -445,7 +458,7 @@ void CardReader::DoDisconnect(uv_work_t* req) { pthread_mutex_lock(&obj->m_mutex); /* Connect */ if (obj->m_card_handle) { - result = SCardDisconnect(obj->m_card_handle, SCARD_UNPOWER_CARD); + result = SCardDisconnect(obj->m_card_handle, disposition); if (result == SCARD_S_SUCCESS) { obj->m_card_handle = 0; }