105 lines
3.1 KiB
JavaScript
105 lines
3.1 KiB
JavaScript
var events = require('events');
|
|
require('buffertools');
|
|
|
|
/* Make sure we choose the correct build directory */
|
|
var bindings = require('bindings')('pcsclite');
|
|
var PCSCLite = bindings.PCSCLite;
|
|
var CardReader = bindings.CardReader;
|
|
inherits(PCSCLite, events.EventEmitter);
|
|
inherits(CardReader, events.EventEmitter);
|
|
|
|
module.exports = function() {
|
|
|
|
var readers = [];
|
|
var p = new PCSCLite();
|
|
process.nextTick(function() {
|
|
p.start(function(e, data) {
|
|
if (e) {
|
|
p.emit('error', e);
|
|
} else {
|
|
/* parse data buffer to get the card reader name, and get the reader */
|
|
var readers_aux = [];
|
|
var ini = 0;
|
|
var pos = 0;
|
|
while((pos = data.slice(ini).indexOf('\0')) > 0) {
|
|
var name = data.slice(ini, ini + pos).toString();
|
|
var is_old = false;
|
|
for (var i = 0; i < readers.length; ++i) {
|
|
if (readers[i].name === name) {
|
|
readers_aux.push(readers[i]);
|
|
is_old = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!is_old) {
|
|
var r = new CardReader(name);
|
|
readers_aux.push(r);
|
|
p.emit('reader', r);
|
|
r.get_status(function(e, status) {
|
|
if (e) {
|
|
r.emit('error', e);
|
|
} else {
|
|
r.emit('status', status);
|
|
r.status = status;
|
|
}
|
|
});
|
|
}
|
|
|
|
ini += pos + 1;
|
|
}
|
|
|
|
readers = readers_aux;
|
|
}
|
|
});
|
|
});
|
|
|
|
return p;
|
|
};
|
|
|
|
CardReader.prototype.connect = function(cb) {
|
|
|
|
if (!this.connected) {
|
|
this._connect(cb);
|
|
} else {
|
|
cb();
|
|
}
|
|
};
|
|
|
|
CardReader.prototype.disconnect = function(cb) {
|
|
|
|
if (this.connected) {
|
|
this._disconnect(cb);
|
|
} else {
|
|
cb();
|
|
}
|
|
};
|
|
|
|
CardReader.prototype.transmit = function(data, res_len, protocol, cb) {
|
|
|
|
if (!this.connected) {
|
|
return cb(new Error("Card Reader not connected"));
|
|
}
|
|
|
|
this._transmit(data, res_len, protocol, cb);
|
|
};
|
|
|
|
CardReader.prototype.SCARD_STATE_UNAWARE = 0x0000;
|
|
CardReader.prototype.SCARD_STATE_IGNORE = 0x0001;
|
|
CardReader.prototype.SCARD_STATE_CHANGED = 0x0002;
|
|
CardReader.prototype.SCARD_STATE_UNKNOWN = 0x0004;
|
|
CardReader.prototype.SCARD_STATE_UNAVAILABLE = 0x0008;
|
|
CardReader.prototype.SCARD_STATE_EMPTY = 0x0010;
|
|
CardReader.prototype.SCARD_STATE_PRESENT = 0x0020;
|
|
CardReader.prototype.SCARD_STATE_ATRMATCH = 0x0040;
|
|
CardReader.prototype.SCARD_STATE_EXCLUSIVE = 0x0080;
|
|
CardReader.prototype.CARD_STATE_INUSE = 0x0100;
|
|
CardReader.prototype.SCARD_STATE_MUTE = 0x0200;
|
|
|
|
// extend prototype
|
|
function inherits(target, source) {
|
|
for (var k in source.prototype) {
|
|
target.prototype[k] = source.prototype[k];
|
|
}
|
|
}
|