Refactor pcscslite.js

- Improve and fix how we parse and handle cardreader strings.
This commit is contained in:
Santiago Gimeno
2013-08-07 16:05:54 +02:00
parent 1844bf1f3a
commit 2bb9804a1f

View File

@@ -8,54 +8,57 @@ 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(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, state, atr) {
if (e) {
r.emit('error', e);
} else {
var status = { state : state };
if (atr) {
status.atr = atr;
}
r.emit('status', status);
r.state = state;
}
});
}
ini += pos + 1;
}
readers = readers_aux;
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;
});
});