Refactor pcscslite.js
- Improve and fix how we parse and handle cardreader strings.
This commit is contained in:
@@ -8,38 +8,44 @@ var CardReader = bindings.CardReader;
|
|||||||
inherits(PCSCLite, events.EventEmitter);
|
inherits(PCSCLite, events.EventEmitter);
|
||||||
inherits(CardReader, 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() {
|
module.exports = function() {
|
||||||
|
|
||||||
var readers = [];
|
var readers = [];
|
||||||
var p = new PCSCLite();
|
var p = new PCSCLite();
|
||||||
process.nextTick(function() {
|
process.nextTick(function() {
|
||||||
p.start(function(e, data) {
|
p.start(function(err, data) {
|
||||||
if (e) {
|
if (err) {
|
||||||
p.emit('error', e);
|
return p.emit('error', err);
|
||||||
} 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 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);
|
var r = new CardReader(name);
|
||||||
readers_aux.push(r);
|
readers_aux.push(r);
|
||||||
p.emit('reader', r);
|
r.get_status(function(err, state, atr) {
|
||||||
r.get_status(function(e, state, atr) {
|
if (err) {
|
||||||
if (e) {
|
return r.emit('error', e);
|
||||||
r.emit('error', e);
|
}
|
||||||
} else {
|
|
||||||
var status = { state : state };
|
var status = { state : state };
|
||||||
if (atr) {
|
if (atr) {
|
||||||
status.atr = atr;
|
status.atr = atr;
|
||||||
@@ -47,15 +53,12 @@ module.exports = function() {
|
|||||||
|
|
||||||
r.emit('status', status);
|
r.emit('status', status);
|
||||||
r.state = state;
|
r.state = state;
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
ini += pos + 1;
|
p.emit('reader', r);
|
||||||
}
|
});
|
||||||
|
|
||||||
readers = readers_aux;
|
readers = readers_aux;
|
||||||
}
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user