128 lines
3.3 KiB
JavaScript
128 lines
3.3 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);
|
|
|
|
var parse_readers_string = function(readers_str) {
|
|
var pos;
|
|
var readers = [];
|
|
var ini = 0;
|
|
while ((pos = readers_str.slice(ini).indexOf('\0')) > 0) {
|
|
readers.push(readers_str.slice(ini, ini + pos).toString());
|
|
ini += pos + 1;
|
|
}
|
|
|
|
return readers;
|
|
};
|
|
|
|
module.exports = function() {
|
|
|
|
var readers = [];
|
|
var p = new PCSCLite();
|
|
process.nextTick(function() {
|
|
p.start(function(err, data) {
|
|
if (err) {
|
|
return p.emit('error', err);
|
|
}
|
|
|
|
var readers_aux = [];
|
|
var names = parse_readers_string(data);
|
|
var new_names = names.filter(function(name) {
|
|
return !readers.some(function(reader) {
|
|
return reader.name !== name;
|
|
});
|
|
});
|
|
|
|
new_names.forEach(function(name) {
|
|
var r = new CardReader(name);
|
|
readers_aux.push(r);
|
|
r.get_status(function(err, state, atr) {
|
|
if (err) {
|
|
return r.emit('error', e);
|
|
}
|
|
|
|
var status = { state : state };
|
|
if (atr) {
|
|
status.atr = atr;
|
|
}
|
|
|
|
r.emit('status', status);
|
|
r.state = state;
|
|
});
|
|
|
|
p.emit('reader', r);
|
|
});
|
|
|
|
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.control = function(data, control_code, res_len, cb) {
|
|
if (!this.connected) {
|
|
return cb(new Error("Card Reader not connected"));
|
|
}
|
|
|
|
var output = new Buffer(res_len);
|
|
this._control(data, control_code, output, function(err, len) {
|
|
if (err) {
|
|
return cb(err);
|
|
}
|
|
|
|
cb(err, output.slice(0, len));
|
|
});
|
|
};
|
|
|
|
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];
|
|
}
|
|
}
|