Index: chrome/browser/resources/cryptotoken/gnubby.js |
diff --git a/chrome/browser/resources/cryptotoken/gnubby.js b/chrome/browser/resources/cryptotoken/gnubby.js |
index 27f8c86aa8352996699b1f0ffe954d0700128525..dd013fb69e806d5671353c8d6b7d4c87a1315109 100644 |
--- a/chrome/browser/resources/cryptotoken/gnubby.js |
+++ b/chrome/browser/resources/cryptotoken/gnubby.js |
@@ -44,7 +44,7 @@ usbGnubby.setGnubbies = function(gnubbies) { |
usbGnubby.prototype.enumerate = function(cb) { |
if (!cb) cb = usbGnubby.defaultCallback; |
if (this.closed) { |
- cb(-llGnubby.GONE); |
+ cb(-llGnubby.NODEVICE); |
return; |
} |
if (!usbGnubby.gnubbies_) { |
@@ -58,14 +58,15 @@ usbGnubby.prototype.enumerate = function(cb) { |
/** |
* Opens the gnubby with the given index, or the first found gnubby if no |
* index is specified. |
- * @param {llGnubbyDeviceId|undefined} opt_which The device to open. |
+ * @param {llGnubbyDeviceId} which The device to open. If null, the first |
+ * gnubby found is opened. |
* @param {function(number)|undefined} opt_cb Called with result of opening the |
* gnubby. |
*/ |
-usbGnubby.prototype.open = function(opt_which, opt_cb) { |
+usbGnubby.prototype.open = function(which, opt_cb) { |
var cb = opt_cb ? opt_cb : usbGnubby.defaultCallback; |
if (this.closed) { |
- cb(-llGnubby.GONE); |
+ cb(-llGnubby.NODEVICE); |
return; |
} |
this.closingWhenIdle = false; |
@@ -78,30 +79,42 @@ usbGnubby.prototype.open = function(opt_which, opt_cb) { |
} |
var self = this; |
- function addSelfAsClient(which) { |
+ |
+ function setCid(which) { |
self.cid &= 0x00ffffff; |
self.cid |= ((which.device + 1) << 24); // For debugging. |
+ } |
+ var enumerateRetriesRemaining = 3; |
+ function enumerated(rc, devs) { |
+ if (!devs.length) |
+ rc = -llGnubby.NODEVICE; |
+ if (rc) { |
+ cb(rc); |
+ return; |
+ } |
+ which = devs[0]; |
+ setCid(which); |
usbGnubby.gnubbies_.addClient(which, self, function(rc, device) { |
+ if (rc == -llGnubby.NODEVICE && enumerateRetriesRemaining-- > 0) { |
+ // We were trying to open the first device, but now it's not there? |
+ // Do over. |
+ usbGnubby.gnubbies_.enumerate(enumerated); |
+ return; |
+ } |
self.dev = device; |
cb(rc); |
}); |
} |
- if (!usbGnubby.gnubbies_) { |
- cb(-llGnubby.NODEVICE); |
- return; |
- } |
- if (opt_which) { |
- addSelfAsClient(opt_which); |
- } else { |
- usbGnubby.gnubbies_.enumerate(function(rc, devs) { |
- if (rc || !devs.length) { |
- cb(-llGnubby.NODEVICE); |
- return; |
- } |
- addSelfAsClient(devs[0]); |
+ if (which) { |
+ setCid(which); |
+ usbGnubby.gnubbies_.addClient(which, self, function(rc, device) { |
+ self.dev = device; |
+ cb(rc); |
}); |
+ } else { |
+ usbGnubby.gnubbies_.enumerate(enumerated); |
} |
}; |
@@ -217,7 +230,7 @@ usbGnubby.prototype.readFrame_ = function() { |
*/ |
usbGnubby.prototype.read_ = function(cmd, timeout, cb) { |
if (this.closed) { cb(-llGnubby.GONE); return; } |
- if (!this.dev) { cb(-llGnubby.NODEVICE); return; } |
+ if (!this.dev) { cb(-llGnubby.GONE); return; } |
var tid = null; // timeout timer id. |
var callback = cb; |
@@ -436,7 +449,7 @@ usbGnubby.prototype.exchange_ = function(cmd, data, timeout, cb) { |
/** Default callback for commands. Simply logs to console. |
* @param {number} rc Result status code |
- * @param {*} data Result data |
+ * @param {(ArrayBuffer|Uint8Array|Array.<number>|null)} data Result data |
*/ |
usbGnubby.defaultCallback = function(rc, data) { |
var msg = 'defaultCallback(' + rc; |