Index: remoting/webapp/crd/js/client_session.js |
diff --git a/remoting/webapp/crd/js/client_session.js b/remoting/webapp/crd/js/client_session.js |
index f76069ea1d3f4e6b89ec3c01e9ae7f3114655c91..b31d69f22ff567721d31ba6e0259ae0d4cfb34e0 100644 |
--- a/remoting/webapp/crd/js/client_session.js |
+++ b/remoting/webapp/crd/js/client_session.js |
@@ -8,9 +8,8 @@ |
* |
* The ClientSession class controls lifetime of the client plugin |
* object and provides the plugin with the functionality it needs to |
- * establish connection. Specifically it: |
- * - Delivers incoming/outgoing signaling messages, |
- * - Adjusts plugin size and position when destop resolution changes, |
+ * establish connection, e.g. delivers incoming/outgoing signaling |
+ * messages. |
* |
* This class should not access the plugin directly, instead it should |
* do it through ClientPlugin class which abstracts plugin version |
@@ -24,15 +23,15 @@ var remoting = remoting || {}; |
/** |
* @param {remoting.ClientPlugin} plugin |
- * @param {remoting.Host} host The host to connect to. |
* @param {remoting.SignalStrategy} signalStrategy Signal strategy. |
+ * @param {remoting.ClientSession.EventHandler} listener |
* |
* @constructor |
* @extends {base.EventSourceImpl} |
* @implements {base.Disposable} |
* @implements {remoting.ClientPlugin.ConnectionEventHandler} |
*/ |
-remoting.ClientSession = function(plugin, host, signalStrategy) { |
+remoting.ClientSession = function(plugin, signalStrategy, listener) { |
base.inherits(this, base.EventSourceImpl); |
/** @private */ |
@@ -41,13 +40,19 @@ remoting.ClientSession = function(plugin, host, signalStrategy) { |
/** @private {!remoting.Error} */ |
this.error_ = remoting.Error.none(); |
- /** @private */ |
- this.host_ = host; |
+ /** @private {remoting.Host} */ |
+ this.host_ = null; |
+ |
+ /** @private {remoting.CredentialsProvider} */ |
+ this.credentialsProvider_ = null; |
/** @private */ |
this.sessionId_ = ''; |
/** @private */ |
+ this.listener_ = listener; |
+ |
+ /** @private */ |
this.hasReceivedFrame_ = false; |
this.logToServer = new remoting.LogToServer(signalStrategy); |
@@ -58,9 +63,8 @@ remoting.ClientSession = function(plugin, host, signalStrategy) { |
this.signalStrategy_.setIncomingStanzaCallback( |
this.onIncomingMessage_.bind(this)); |
- /** @private */ |
- this.iqFormatter_ = |
- new remoting.FormatIq(this.signalStrategy_.getJid(), host.jabberId); |
+ /** @private {remoting.FormatIq} */ |
+ this.iqFormatter_ = null; |
/** |
* Allow host-offline error reporting to be suppressed in situations where it |
@@ -255,6 +259,21 @@ remoting.ClientSession.Capability = { |
}; |
/** |
+ * Connects to |host| using |credentialsProvider| as the credentails. |
+ * |
+ * @param {remoting.Host} host |
+ * @param {remoting.CredentialsProvider} credentialsProvider |
+ */ |
+remoting.ClientSession.prototype.connect = function(host, credentialsProvider) { |
+ this.host_ = host; |
+ this.credentialsProvider_ = credentialsProvider; |
+ this.iqFormatter_ = |
+ new remoting.FormatIq(this.signalStrategy_.getJid(), host.jabberId); |
+ this.plugin_.connect(this.host_, this.signalStrategy_.getJid(), |
+ credentialsProvider); |
+}; |
+ |
+/** |
* Disconnect the current session with a particular |error|. The session will |
* raise a |stateChanged| event in response to it. The caller should then call |
* dispose() to remove and destroy the <embed> element. |
@@ -297,6 +316,7 @@ remoting.ClientSession.prototype.disconnect = function(error) { |
remoting.ClientSession.prototype.dispose = function() { |
base.dispose(this.connectedDisposables_); |
this.connectedDisposables_ = null; |
+ base.dispose(this.plugin_); |
this.plugin_ = null; |
}; |
@@ -488,7 +508,65 @@ remoting.ClientSession.prototype.setState_ = function(newState) { |
this.connectedDisposables_ = null; |
} |
+ this.notifyStateChanges_(oldState, this.state_); |
this.logToServer.logClientSessionStateChange(this.state_, this.error_); |
+}; |
+ |
+/** |
+ * @param {remoting.ClientSession.State} oldState The new state for the session. |
+ * @param {remoting.ClientSession.State} newState The new state for the session. |
+ * @private |
+ */ |
+remoting.ClientSession.prototype.notifyStateChanges_ = |
+ function(oldState, newState) { |
+ /** @type {remoting.Error} */ |
+ var error; |
+ switch (this.state_) { |
+ case remoting.ClientSession.State.CONNECTED: |
+ console.log('Connection established.'); |
+ var connectionInfo = new remoting.ConnectionInfo( |
+ this.host_, this.credentialsProvider_, this, this.plugin_); |
+ this.listener_.onConnected(connectionInfo); |
+ break; |
+ |
+ case remoting.ClientSession.State.CONNECTING: |
+ remoting.identity.getEmail().then(function(/** string */ email) { |
+ console.log('Connecting as ' + email); |
+ }); |
+ break; |
+ |
+ case remoting.ClientSession.State.AUTHENTICATED: |
+ console.log('Connection authenticated.'); |
+ break; |
+ |
+ case remoting.ClientSession.State.INITIALIZING: |
+ console.log('Connection initializing .'); |
+ break; |
+ |
+ case remoting.ClientSession.State.CLOSED: |
+ console.log('Connection closed.'); |
+ this.listener_.onDisconnected(); |
+ break; |
+ |
+ case remoting.ClientSession.State.FAILED: |
+ error = this.getError(); |
+ console.error('Connection failed: ' + error.toString()); |
+ this.listener_.onConnectionFailed(error); |
+ break; |
+ |
+ case remoting.ClientSession.State.CONNECTION_DROPPED: |
+ error = this.getError(); |
+ console.error('Connection dropped: ' + error.toString()); |
+ this.listener_.onError(error); |
+ break; |
+ |
+ default: |
+ console.error('Unexpected client plugin state: ' + newState); |
+ // This should only happen if the web-app and client plugin get out of |
+ // sync, and even then the version check should ensure compatibility. |
+ this.listener_.onError( |
+ new remoting.Error(remoting.Error.Tag.MISSING_PLUGIN)); |
+ } |
this.raiseEvent(remoting.ClientSession.Events.stateChanged, |
new remoting.ClientSession.StateEvent(newState, oldState) |