From 2bb9804a1ffa48cd93f471402cfe28598302adc6 Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Wed, 7 Aug 2013 16:05:54 +0200 Subject: [PATCH] Refactor pcscslite.js - Improve and fix how we parse and handle cardreader strings. --- lib/pcsclite.js | 87 +++++++++++++++++++++++++------------------------ 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/lib/pcsclite.js b/lib/pcsclite.js index 48c3831..9f1e0fe 100644 --- a/lib/pcsclite.js +++ b/lib/pcsclite.js @@ -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; }); });