OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 * Connect set-up state machine for Me2Me and IT2Me | 7 * Connect set-up state machine for Me2Me and IT2Me |
8 */ | 8 */ |
9 | 9 |
10 'use strict'; | 10 'use strict'; |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 this.logHostOfflineErrors_ = false; | 82 this.logHostOfflineErrors_ = false; |
83 | 83 |
84 /** @private {remoting.ClientPlugin} */ | 84 /** @private {remoting.ClientPlugin} */ |
85 this.plugin_ = null; | 85 this.plugin_ = null; |
86 | 86 |
87 /** @private {remoting.ClientSession} */ | 87 /** @private {remoting.ClientSession} */ |
88 this.clientSession_ = null; | 88 this.clientSession_ = null; |
89 | 89 |
90 /** @private {remoting.CredentialsProvider} */ | 90 /** @private {remoting.CredentialsProvider} */ |
91 this.credentialsProvider_ = null; | 91 this.credentialsProvider_ = null; |
92 | |
93 /** @private {Object<string,remoting.ProtocolExtension>} */ | |
94 this.protocolExtensions_ = {}; | |
95 | |
96 /** | |
97 * True once a session has been created and we've started the extensions. | |
98 * This is used to immediately start any extensions that are registered | |
99 * after the CONNECTED state change. | |
100 * @private {boolean} | |
101 */ | |
102 this.protocolExtensionsStarted_ = false; | |
103 }; | 92 }; |
104 | 93 |
105 /** | 94 /** |
106 * Initiate a Me2Me connection. | 95 * Initiate a Me2Me connection. |
107 * | 96 * |
108 * This doesn't report host-offline errors because the connection will | 97 * This doesn't report host-offline errors because the connection will |
109 * be retried and retryConnectMe2Me is responsible for reporting these errors. | 98 * be retried and retryConnectMe2Me is responsible for reporting these errors. |
110 * | 99 * |
111 * @param {remoting.Host} host The Me2Me host to which to connect. | 100 * @param {remoting.Host} host The Me2Me host to which to connect. |
112 * @param {function(boolean, function(string):void):void} fetchPin Function to | 101 * @param {function(boolean, function(string):void):void} fetchPin Function to |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 } | 309 } |
321 | 310 |
322 if (!this.plugin_.isSupportedVersion()) { | 311 if (!this.plugin_.isSupportedVersion()) { |
323 console.error('ERROR: bad plugin version'); | 312 console.error('ERROR: bad plugin version'); |
324 this.pluginError_(new remoting.Error( | 313 this.pluginError_(new remoting.Error( |
325 remoting.Error.Tag.BAD_PLUGIN_VERSION)); | 314 remoting.Error.Tag.BAD_PLUGIN_VERSION)); |
326 return; | 315 return; |
327 } | 316 } |
328 | 317 |
329 this.clientSession_ = new remoting.ClientSession( | 318 this.clientSession_ = new remoting.ClientSession( |
330 this.plugin_, this.host_, this.signalStrategy_, | 319 this.plugin_, this.host_, this.signalStrategy_); |
331 this.onProtocolExtensionMessage_.bind(this)); | |
332 remoting.clientSession = this.clientSession_; | 320 remoting.clientSession = this.clientSession_; |
333 | 321 |
334 this.clientSession_.logHostOfflineErrors(this.logHostOfflineErrors_); | 322 this.clientSession_.logHostOfflineErrors(this.logHostOfflineErrors_); |
335 this.clientSession_.addEventListener( | 323 this.clientSession_.addEventListener( |
336 remoting.ClientSession.Events.stateChanged, | 324 remoting.ClientSession.Events.stateChanged, |
337 this.bound_.onStateChange); | 325 this.bound_.onStateChange); |
338 | 326 |
339 this.plugin_.connect( | 327 this.plugin_.connect( |
340 this.host_, this.signalStrategy_.getJid(), this.credentialsProvider_); | 328 this.host_, this.signalStrategy_.getJid(), this.credentialsProvider_); |
341 }; | 329 }; |
(...skipping 11 matching lines...) Expand all Loading... |
353 remoting.SessionConnectorImpl.prototype.closeSession = function() { | 341 remoting.SessionConnectorImpl.prototype.closeSession = function() { |
354 base.dispose(this.clientSession_); | 342 base.dispose(this.clientSession_); |
355 this.clientSession_ = null; | 343 this.clientSession_ = null; |
356 remoting.clientSession = null; | 344 remoting.clientSession = null; |
357 | 345 |
358 base.dispose(this.plugin_); | 346 base.dispose(this.plugin_); |
359 this.plugin_ = null; | 347 this.plugin_ = null; |
360 }; | 348 }; |
361 | 349 |
362 /** | 350 /** |
363 * @param {remoting.ProtocolExtension} extension | |
364 */ | |
365 remoting.SessionConnectorImpl.prototype.registerProtocolExtension = | |
366 function(extension) { | |
367 var types = extension.getExtensionTypes(); | |
368 | |
369 // Make sure we don't have an extension of that type already registered. | |
370 for (var i=0, len=types.length; i < len; i++) { | |
371 if (types[i] in this.protocolExtensions_) { | |
372 console.error( | |
373 'Attempt to register multiple extensions of the same type: ', type); | |
374 return; | |
375 } | |
376 } | |
377 | |
378 for (var i=0, len=types.length; i < len; i++) { | |
379 var type = types[i]; | |
380 this.protocolExtensions_[type] = extension; | |
381 if (this.protocolExtensionsStarted_) { | |
382 this.startProtocolExtension_(type); | |
383 } | |
384 } | |
385 }; | |
386 | |
387 /** @private */ | |
388 remoting.SessionConnectorImpl.prototype.initProtocolExtensions_ = function() { | |
389 base.debug.assert(!this.protocolExtensionsStarted_); | |
390 for (var type in this.protocolExtensions_) { | |
391 this.startProtocolExtension_(type); | |
392 } | |
393 this.protocolExtensionsStarted_ = true; | |
394 }; | |
395 | |
396 /** | |
397 * @param {string} type | |
398 * @private | |
399 */ | |
400 remoting.SessionConnectorImpl.prototype.startProtocolExtension_ = | |
401 function(type) { | |
402 var extension = this.protocolExtensions_[type]; | |
403 extension.startExtension(this.plugin_.sendClientMessage.bind(this.plugin_)); | |
404 }; | |
405 | |
406 /** | |
407 * Called when an extension message needs to be handled. | |
408 * | |
409 * @param {string} type The type of the extension message. | |
410 * @param {string} data The payload of the extension message. | |
411 * @return {boolean} Return true if the extension message was recognized. | |
412 * @private | |
413 */ | |
414 remoting.SessionConnectorImpl.prototype.onProtocolExtensionMessage_ = | |
415 function(type, data) { | |
416 if (type == 'test-echo-reply') { | |
417 console.log('Got echo reply: ' + data); | |
418 return true; | |
419 } | |
420 | |
421 var message = base.jsonParseSafe(data); | |
422 if (typeof message != 'object') { | |
423 console.error('Error parsing extension json data: ' + data); | |
424 return false; | |
425 } | |
426 | |
427 if (type in this.protocolExtensions_) { | |
428 /** @type {remoting.ProtocolExtension} */ | |
429 var extension = this.protocolExtensions_[type]; | |
430 var handled = false; | |
431 try { | |
432 handled = extension.onExtensionMessage(type, message); | |
433 } catch (/** @type {*} */ err) { | |
434 console.error('Failed to process protocol extension ' + type + | |
435 ' message: ' + err); | |
436 } | |
437 if (handled) { | |
438 return true; | |
439 } | |
440 } | |
441 | |
442 return false; | |
443 }; | |
444 | |
445 /** | |
446 * Handle a change in the state of the client session prior to successful | 351 * Handle a change in the state of the client session prior to successful |
447 * connection (after connection, this class no longer handles state change | 352 * connection (after connection, this class no longer handles state change |
448 * events). Errors that occur while connecting either trigger a reconnect | 353 * events). Errors that occur while connecting either trigger a reconnect |
449 * or notify the onError handler. | 354 * or notify the onError handler. |
450 * | 355 * |
451 * @param {remoting.ClientSession.StateEvent=} event | 356 * @param {remoting.ClientSession.StateEvent=} event |
452 * @return {void} Nothing. | 357 * @return {void} Nothing. |
453 * @private | 358 * @private |
454 */ | 359 */ |
455 remoting.SessionConnectorImpl.prototype.onStateChange_ = function(event) { | 360 remoting.SessionConnectorImpl.prototype.onStateChange_ = function(event) { |
456 switch (event.current) { | 361 switch (event.current) { |
457 case remoting.ClientSession.State.CONNECTED: | 362 case remoting.ClientSession.State.CONNECTED: |
458 // When the connection succeeds, deregister for state-change callbacks | 363 // When the connection succeeds, deregister for state-change callbacks |
459 // and pass the session to the onConnected callback. It is expected that | 364 // and pass the session to the onConnected callback. It is expected that |
460 // it will register a new state-change callback to handle disconnect | 365 // it will register a new state-change callback to handle disconnect |
461 // or error conditions. | 366 // or error conditions. |
462 this.clientSession_.removeEventListener( | 367 this.clientSession_.removeEventListener( |
463 remoting.ClientSession.Events.stateChanged, | 368 remoting.ClientSession.Events.stateChanged, |
464 this.bound_.onStateChange); | 369 this.bound_.onStateChange); |
465 | 370 |
466 base.dispose(this.reconnector_); | 371 base.dispose(this.reconnector_); |
467 if (remoting.app.getConnectionMode() != remoting.Application.Mode.IT2ME) { | 372 if (remoting.app.getConnectionMode() != remoting.Application.Mode.IT2ME) { |
468 this.reconnector_ = | 373 this.reconnector_ = |
469 new remoting.SmartReconnector(this, this.clientSession_); | 374 new remoting.SmartReconnector(this, this.clientSession_); |
470 } | 375 } |
471 var connectionInfo = new remoting.ConnectionInfo( | 376 var connectionInfo = new remoting.ConnectionInfo( |
472 this.host_, this.credentialsProvider_, this.clientSession_, | 377 this.host_, this.credentialsProvider_, this.clientSession_, |
473 this.plugin_); | 378 this.plugin_); |
474 this.onConnected_(connectionInfo); | 379 this.onConnected_(connectionInfo); |
475 // Initialize any protocol extensions that may have been added by the app. | |
476 this.initProtocolExtensions_(); | |
477 break; | 380 break; |
478 | 381 |
479 case remoting.ClientSession.State.CONNECTING: | 382 case remoting.ClientSession.State.CONNECTING: |
480 remoting.identity.getEmail().then( | 383 remoting.identity.getEmail().then( |
481 function(/** string */ email) { | 384 function(/** string */ email) { |
482 console.log('Connecting as ' + email); | 385 console.log('Connecting as ' + email); |
483 }); | 386 }); |
484 break; | 387 break; |
485 | 388 |
486 case remoting.ClientSession.State.AUTHENTICATED: | 389 case remoting.ClientSession.State.AUTHENTICATED: |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
538 * @return {remoting.SessionConnector} | 441 * @return {remoting.SessionConnector} |
539 */ | 442 */ |
540 remoting.DefaultSessionConnectorFactory.prototype.createConnector = | 443 remoting.DefaultSessionConnectorFactory.prototype.createConnector = |
541 function(clientContainer, onConnected, onError, | 444 function(clientContainer, onConnected, onError, |
542 onConnectionFailed, requiredCapabilities) { | 445 onConnectionFailed, requiredCapabilities) { |
543 return new remoting.SessionConnectorImpl(clientContainer, onConnected, | 446 return new remoting.SessionConnectorImpl(clientContainer, onConnected, |
544 onError, | 447 onError, |
545 onConnectionFailed, | 448 onConnectionFailed, |
546 requiredCapabilities); | 449 requiredCapabilities); |
547 }; | 450 }; |
OLD | NEW |