Refactor pcscslite.js
- Improve and fix how we parse and handle cardreader strings.
This commit is contained in:
@@ -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;
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user