This repository has been archived on 2021-04-21. You can view files and clone it, but cannot push or open issues or pull requests.
Files
node-pcsclite/lib/pcsclite.js
2013-06-20 16:37:28 +02:00

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];
}
}