Index: remoting/webapp/crd/js/gcd_host_list_api.js |
diff --git a/remoting/webapp/crd/js/host_list_api_gcd_impl.js b/remoting/webapp/crd/js/gcd_host_list_api.js |
similarity index 54% |
rename from remoting/webapp/crd/js/host_list_api_gcd_impl.js |
rename to remoting/webapp/crd/js/gcd_host_list_api.js |
index 2e6e508c9fdfd5be6f681328837bc7924c060beb..a904c9dce511d61c20df792183bb485d2475b36e 100644 |
--- a/remoting/webapp/crd/js/host_list_api_gcd_impl.js |
+++ b/remoting/webapp/crd/js/gcd_host_list_api.js |
@@ -18,26 +18,34 @@ var remoting = remoting || {}; |
* @constructor |
* @implements {remoting.HostListApi} |
*/ |
-remoting.HostListApiGcdImpl = function() { |
+remoting.GcdHostListApi = function() { |
this.gcd_ = new remoting.gcd.Client({ |
apiKey: remoting.settings.GOOGLE_API_KEY |
}); |
}; |
/** @override */ |
-remoting.HostListApiGcdImpl.prototype.register = function( |
- newHostId, hostName, publicKey, hostClientId) { |
+remoting.GcdHostListApi.prototype.register = function( |
+ hostName, publicKey, hostClientId) { |
var self = this; |
var deviceDraft = { |
channel: { |
supportedType: 'xmpp' |
}, |
deviceKind: 'vendor', |
- name: newHostId, |
- displayName: hostName, |
+ name: hostName, |
state: { |
- 'publicKey': publicKey |
- } |
+ base: { |
+ firmwareVersion: 'none', |
+ localDiscoveryEnabled: false, |
+ localAnonymousAccessMaxRole: 'none', |
+ localPairingEnabled: false, |
+ // The leading underscore is necessary for |_publicKey| |
+ // because it's not a standard key defined by GCD. |
+ _publicKey: publicKey |
+ } |
+ }, |
+ 'tags': [CHROMOTING_DEVICE_TAG] |
}; |
return /** @type {!Promise<remoting.HostListApi.RegisterResult>} */ ( |
@@ -53,7 +61,8 @@ remoting.HostListApiGcdImpl.prototype.register = function( |
return { |
authCode: ticket.robotAccountAuthorizationCode, |
email: ticket.robotAccountEmail, |
- gcdId: ticket.deviceId |
+ hostId: ticket.deviceId, |
+ isLegacy: false |
}; |
}). |
catch(function(error) { |
@@ -63,13 +72,15 @@ remoting.HostListApiGcdImpl.prototype.register = function( |
}; |
/** @override */ |
-remoting.HostListApiGcdImpl.prototype.get = function() { |
+remoting.GcdHostListApi.prototype.get = function() { |
return this.gcd_.listDevices(). |
then(function(devices) { |
var hosts = []; |
devices.forEach(function(device) { |
try { |
- hosts.push(deviceToHost(device)); |
+ if (isChromotingHost(device)) { |
+ hosts.push(deviceToHost(device)); |
+ } |
} catch (/** @type {*} */ error) { |
console.warn('Invalid device spec:', error); |
} |
@@ -79,41 +90,64 @@ remoting.HostListApiGcdImpl.prototype.get = function() { |
}; |
/** @override */ |
-remoting.HostListApiGcdImpl.prototype.put = |
+remoting.GcdHostListApi.prototype.put = |
function(hostId, hostName, hostPublicKey) { |
- // TODO(jrw) |
- throw new Error('Not implemented'); |
+ return this.gcd_.patchDevice(hostId, { |
+ 'name': hostName |
+ }).then(function(device) { |
+ if (device.name != hostName) { |
+ console.error('error updating host name'); |
+ throw remoting.Error.unexpected(); |
+ } |
+ if (!device.state || device.state['_publicKey'] != hostPublicKey) { |
+ // TODO(jrw): Is there any reason to believe this would ever be |
+ // happen? |
+ console.error('unexpected host public key'); |
+ throw remoting.Error.unexpected(); |
+ } |
+ // Don't return anything. |
+ }); |
}; |
/** @override */ |
-remoting.HostListApiGcdImpl.prototype.remove = function(hostId) { |
- var that = this; |
- return this.gcd_.listDevices(hostId).then(function(devices) { |
- var gcdId = null; |
- for (var i = 0; i < devices.length; i++) { |
- var device = devices[i]; |
- // The "name" field in GCD holds what Chromoting considers to be |
- // the host ID. |
- if (device.name == hostId) { |
- gcdId = device.id; |
- } |
- } |
- if (gcdId == null) { |
- return false; |
- } else { |
- return that.gcd_.deleteDevice(gcdId); |
+remoting.GcdHostListApi.prototype.remove = function(hostId) { |
+ return this.gcd_.deleteDevice(hostId).then(function(deleted) { |
+ if (!deleted) { |
+ console.error('error deleting host from GCD'); |
+ throw remoting.Error.unexpected(); |
} |
+ // Don't return anything. |
}); |
}; |
/** @override */ |
-remoting.HostListApiGcdImpl.prototype.getSupportHost = function(supportId) { |
+remoting.GcdHostListApi.prototype.getSupportHost = function(supportId) { |
console.error('getSupportHost not supported by HostListApiGclImpl'); |
return Promise.reject(remoting.Error.unexpected()); |
}; |
/** |
+ * Tag for distinguishing Chromoting hosts from other devices stored |
+ * in GCD. |
+ * |
+ * @const |
+ */ |
+var CHROMOTING_DEVICE_TAG = '1ce4542c-dd87-4320-ba19-ac173f98c04e'; |
+ |
+/** |
+ * Check whether a GCD device entry is a Chromoting host. |
+ * |
+ * @param {remoting.gcd.Device} device |
+ * @return {boolean} |
+ */ |
+function isChromotingHost(device) { |
+ return device.tags != null && |
+ device.tags.indexOf(CHROMOTING_DEVICE_TAG) != -1; |
+} |
+ |
+/** |
* Converts a GCD device description to a Host object. |
+ * |
* @param {!Object} device |
* @return {!remoting.Host} |
*/ |
@@ -122,15 +156,16 @@ function deviceToHost(device) { |
'online': 'ONLINE', |
'offline': 'OFFLINE' |
}; |
- var hostId = base.getStringAttr(device, 'name'); |
+ var hostId = base.getStringAttr(device, 'id'); |
var host = new remoting.Host(hostId); |
- host.hostName = base.getStringAttr(device, 'displayName'); |
+ host.hostName = base.getStringAttr(device, 'name'); |
host.status = base.getStringAttr( |
statusMap, base.getStringAttr(device, 'connectionStatus')); |
var state = base.getObjectAttr(device, 'state', {}); |
- host.publicKey = base.getStringAttr(state, 'publicKey'); |
- host.jabberId = base.getStringAttr(state, 'jabberId', ''); |
- host.hostVersion = base.getStringAttr(state, 'hostVersion', ''); |
+ var baseState = base.getObjectAttr(state, 'base', {}); |
+ host.publicKey = base.getStringAttr(baseState, '_publicKey'); |
+ host.jabberId = base.getStringAttr(baseState, '_jabberId', ''); |
+ host.hostVersion = base.getStringAttr(baseState, '_hostVersion', ''); |
var creationTimeMs = base.getNumberAttr(device, 'creationTimeMs', 0); |
if (creationTimeMs) { |
host.createdTime = new Date(creationTimeMs).toISOString(); |