OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * @fileoverview | 6 * @fileoverview |
7 * Interface abstracting the Application functionality. | 7 * Interface abstracting the Application functionality. |
8 */ | 8 */ |
9 | 9 |
10 'use strict'; | 10 'use strict'; |
11 | 11 |
12 /** @suppress {duplicate} */ | 12 /** @suppress {duplicate} */ |
13 var remoting = remoting || {}; | 13 var remoting = remoting || {}; |
14 | 14 |
15 /** | 15 /** |
| 16 * @type {remoting.ClientSession} The client session object, set once the |
| 17 * connector has invoked its onOk callback. |
| 18 * TODO(garykac): Make clientSession a member var of Application. |
| 19 */ |
| 20 remoting.clientSession = null; |
| 21 |
| 22 /** |
| 23 * @type {remoting.DesktopConnectedView} The client session view object, set |
| 24 * once the connector has invoked its onOk callback. |
| 25 */ |
| 26 remoting.desktopConnectedView = null; |
| 27 |
| 28 /** |
16 * @param {Array<string>} app_capabilities Array of application capabilities. | 29 * @param {Array<string>} app_capabilities Array of application capabilities. |
17 * @constructor | 30 * @constructor |
18 */ | 31 */ |
19 remoting.Application = function(app_capabilities) { | 32 remoting.Application = function(app_capabilities) { |
20 /** | 33 /** |
21 * @type {remoting.Application.Delegate} | 34 * @type {remoting.Application.Delegate} |
22 * @private | 35 * @private |
23 */ | 36 */ |
24 this.delegate_ = null; | 37 this.delegate_ = null; |
25 | 38 |
26 /** | 39 /** |
27 * @type {Array<string>} | 40 * @type {Array<string>} |
28 * @private | 41 * @private |
29 */ | 42 */ |
30 this.app_capabilities_ = [ | 43 this.app_capabilities_ = [ |
31 remoting.ClientSession.Capability.SEND_INITIAL_RESOLUTION, | 44 remoting.ClientSession.Capability.SEND_INITIAL_RESOLUTION, |
32 remoting.ClientSession.Capability.RATE_LIMIT_RESIZE_REQUESTS, | 45 remoting.ClientSession.Capability.RATE_LIMIT_RESIZE_REQUESTS, |
33 remoting.ClientSession.Capability.VIDEO_RECORDER | 46 remoting.ClientSession.Capability.VIDEO_RECORDER |
34 ]; | 47 ]; |
35 // Append the app-specific capabilities. | 48 // Append the app-specific capabilities. |
36 this.app_capabilities_.push.apply(this.app_capabilities_, app_capabilities); | 49 this.app_capabilities_.push.apply(this.app_capabilities_, app_capabilities); |
37 | 50 |
38 /** | 51 /** |
39 * @type {remoting.SessionConnector} | 52 * @type {remoting.SessionConnector} |
40 * @private | 53 * @private |
41 */ | 54 */ |
42 this.session_connector_ = null; | 55 this.session_connector_ = null; |
| 56 |
| 57 /** @private {base.Disposable} */ |
| 58 this.sessionConnectedHooks_ = null; |
43 }; | 59 }; |
44 | 60 |
45 /** | 61 /** |
46 * @param {remoting.Application.Delegate} appDelegate The delegate that | 62 * @param {remoting.Application.Delegate} appDelegate The delegate that |
47 * contains the app-specific functionality. | 63 * contains the app-specific functionality. |
48 */ | 64 */ |
49 remoting.Application.prototype.setDelegate = function(appDelegate) { | 65 remoting.Application.prototype.setDelegate = function(appDelegate) { |
50 this.delegate_ = appDelegate; | 66 this.delegate_ = appDelegate; |
51 }; | 67 }; |
52 | 68 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 remoting.SessionConnector.factory = | 102 remoting.SessionConnector.factory = |
87 new remoting.DefaultSessionConnectorFactory(); | 103 new remoting.DefaultSessionConnectorFactory(); |
88 | 104 |
89 // TODO(garykac): This should be owned properly rather than living in the | 105 // TODO(garykac): This should be owned properly rather than living in the |
90 // global 'remoting' namespace. | 106 // global 'remoting' namespace. |
91 remoting.settings = new remoting.Settings(); | 107 remoting.settings = new remoting.Settings(); |
92 | 108 |
93 this.delegate_.init(this.getSessionConnector()); | 109 this.delegate_.init(this.getSessionConnector()); |
94 }; | 110 }; |
95 | 111 |
| 112 /** Disconnect the remoting client. */ |
| 113 remoting.Application.prototype.disconnect = function() { |
| 114 if (remoting.clientSession) { |
| 115 remoting.clientSession.disconnect(remoting.Error.NONE); |
| 116 console.log('Disconnected.'); |
| 117 } |
| 118 }; |
| 119 |
96 /** | 120 /** |
97 * Called when a new session has been connected. | 121 * Called when a new session has been connected. |
98 * | 122 * |
99 * @param {remoting.ClientSession} clientSession | 123 * @param {remoting.ClientSession} clientSession |
100 * @return {void} Nothing. | 124 * @return {void} Nothing. |
101 */ | 125 */ |
102 remoting.Application.prototype.onConnected = function(clientSession) { | 126 remoting.Application.prototype.onConnected = function(clientSession) { |
103 // TODO(garykac): Make clientSession a member var of Application. | |
104 remoting.clientSession = clientSession; | 127 remoting.clientSession = clientSession; |
105 remoting.clientSession.addEventListener('stateChanged', onClientStateChange_); | 128 this.sessionConnectedHooks_ = new base.Disposables( |
106 | 129 new base.EventHook( |
| 130 clientSession, 'stateChanged', this.onClientStateChange_.bind(this)), |
| 131 new base.RepeatingTimer(this.updateStatistics_.bind(this), 1000) |
| 132 ); |
107 remoting.clipboard.startSession(); | 133 remoting.clipboard.startSession(); |
108 updateStatistics_(); | |
109 | 134 |
110 this.delegate_.handleConnected(clientSession); | 135 this.delegate_.handleConnected(clientSession); |
111 }; | 136 }; |
112 | 137 |
113 /** | 138 /** |
114 * Called when the current session has been disconnected. | 139 * Called when the current session has been disconnected. |
115 * | 140 * |
116 * @return {void} Nothing. | 141 * @return {void} Nothing. |
117 */ | 142 */ |
118 remoting.Application.prototype.onDisconnected = function() { | 143 remoting.Application.prototype.onDisconnected = function() { |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 this.onConnected.bind(this), | 210 this.onConnected.bind(this), |
186 this.onError.bind(this), | 211 this.onError.bind(this), |
187 this.onExtensionMessage.bind(this), | 212 this.onExtensionMessage.bind(this), |
188 this.onConnectionFailed.bind(this), | 213 this.onConnectionFailed.bind(this), |
189 this.getRequiredCapabilities_(), | 214 this.getRequiredCapabilities_(), |
190 this.delegate_.getDefaultRemapKeys()); | 215 this.delegate_.getDefaultRemapKeys()); |
191 } | 216 } |
192 return this.session_connector_; | 217 return this.session_connector_; |
193 }; | 218 }; |
194 | 219 |
| 220 /** |
| 221 * Callback function called when the state of the client plugin changes. The |
| 222 * current and previous states are available via the |state| member variable. |
| 223 * |
| 224 * @param {remoting.ClientSession.StateEvent=} state |
| 225 * @private |
| 226 */ |
| 227 remoting.Application.prototype.onClientStateChange_ = function(state) { |
| 228 switch (state.current) { |
| 229 case remoting.ClientSession.State.CLOSED: |
| 230 console.log('Connection closed by host'); |
| 231 this.onDisconnected(); |
| 232 break; |
| 233 case remoting.ClientSession.State.FAILED: |
| 234 var error = remoting.clientSession.getError(); |
| 235 console.error('Client plugin reported connection failed: ' + error); |
| 236 if (error === null) { |
| 237 error = remoting.Error.UNEXPECTED; |
| 238 } |
| 239 this.onError(error); |
| 240 break; |
| 241 |
| 242 default: |
| 243 console.error('Unexpected client plugin state: ' + state.current); |
| 244 // This should only happen if the web-app and client plugin get out of |
| 245 // sync, so MISSING_PLUGIN is a suitable error. |
| 246 this.onError(remoting.Error.MISSING_PLUGIN); |
| 247 break; |
| 248 } |
| 249 |
| 250 base.dispose(this.sessionConnectedHooks_); |
| 251 this.sessionConnectedHooks_= null; |
| 252 remoting.clientSession.dispose(); |
| 253 remoting.clientSession = null; |
| 254 }; |
| 255 |
| 256 /** @private */ |
| 257 remoting.Application.prototype.updateStatistics_ = function() { |
| 258 var perfstats = remoting.clientSession.getPerfStats(); |
| 259 remoting.stats.update(perfstats); |
| 260 remoting.clientSession.logStatistics(perfstats); |
| 261 }; |
195 | 262 |
196 /** | 263 /** |
197 * @interface | 264 * @interface |
198 */ | 265 */ |
199 remoting.Application.Delegate = function() {}; | 266 remoting.Application.Delegate = function() {}; |
200 | 267 |
201 /** | 268 /** |
202 * Initialize the application and register all event handlers. After this | 269 * Initialize the application and register all event handlers. After this |
203 * is called, the app is running and waiting for user events. | 270 * is called, the app is running and waiting for user events. |
204 * | 271 * |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 * Called when an error needs to be displayed to the user. | 333 * Called when an error needs to be displayed to the user. |
267 * | 334 * |
268 * @param {remoting.Error} errorTag The error to be localized and displayed. | 335 * @param {remoting.Error} errorTag The error to be localized and displayed. |
269 * @return {void} Nothing. | 336 * @return {void} Nothing. |
270 */ | 337 */ |
271 remoting.Application.Delegate.prototype.handleError = function(errorTag) {}; | 338 remoting.Application.Delegate.prototype.handleError = function(errorTag) {}; |
272 | 339 |
273 | 340 |
274 /** @type {remoting.Application} */ | 341 /** @type {remoting.Application} */ |
275 remoting.app = null; | 342 remoting.app = null; |
OLD | NEW |