text: // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  /**
   * @fileoverview
   * Class handling creation and teardown of a remoting host session.
   *
   * This abstracts a <embed> element and controls the plugin which does the
   * actual remoting work.  There should be no UI code inside this class.  It
   * should be purely thought of as a controller of sorts.
   */
  
  'use strict';
  
  /** @suppress {duplicate} */
  var remoting = remoting || {};
  
  /**
   * @constructor
   */
  remoting.HostSession = function() {
    /** @type {remoting.It2MeHostFacade} @private */
    this.hostFacade_ = null;
  };
  
  // Note that these values are copied directly from host_script_object.h and
  // must be kept in sync.
  /** @enum {number} */
  remoting.HostSession.State = {
    UNKNOWN: -1,
    DISCONNECTED: 0,
    STARTING: 1,
    REQUESTED_ACCESS_CODE: 2,
    RECEIVED_ACCESS_CODE: 3,
    CONNECTED: 4,
    DISCONNECTING: 5,
    ERROR: 6,
    INVALID_DOMAIN_ERROR: 7
  };
  
  /**
   * @param {string} stateString The string representation of the host state.
   * @return {remoting.HostSession.State} The HostSession.State enum value
   *     corresponding to stateString.
   */
  remoting.HostSession.State.fromString = function(stateString) {
    if (!remoting.HostSession.State.hasOwnProperty(stateString)) {
      console.error('Unexpected HostSession.State string: ', stateString);
      return remoting.HostSession.State.UNKNOWN;
    }
    return remoting.HostSession.State[stateString];
  }
  
  /**
   * Initiates a connection.
   * @param {remoting.It2MeHostFacade} hostFacade It2Me host facade to use.
   * @param {string} email The user's email address.
   * @param {string} accessToken A valid OAuth2 access token.
   * @param {function(remoting.HostSession.State):void} onStateChanged
   *     Callback for notifications of changes to the host plugin's state.
   * @param {function(boolean):void} onNatTraversalPolicyChanged Callback
   *     for notification of changes to the NAT traversal policy.
   * @param {function(string):void} logDebugInfo Callback allowing the plugin
   *     to log messages to the debug log.
   * @param {function():void} onError Callback to invoke in case of an error.
   */
  remoting.HostSession.prototype.connect =
      function(hostFacade, email, accessToken, onStateChanged,
               onNatTraversalPolicyChanged, logDebugInfo, onError) {
    /** @private */
    this.hostFacade_ = hostFacade;
  
    this.hostFacade_.connect(
        email, 'oauth2:' + accessToken,
        onStateChanged, onNatTraversalPolicyChanged, logDebugInfo,
        remoting.settings.XMPP_SERVER_ADDRESS,
        remoting.settings.XMPP_SERVER_USE_TLS,
        remoting.settings.DIRECTORY_BOT_JID,
        onError);
  };
  
  /**
   * Get the access code generated by the it2me host. Valid only after the
   * host state is RECEIVED_ACCESS_CODE.
   * @return {string} The access code.
   */
  remoting.HostSession.prototype.getAccessCode = function() {
    return this.hostFacade_.getAccessCode();
  };
  
  /**
   * Get the lifetime for the access code. Valid only after the host state is
   * RECEIVED_ACCESS_CODE.
   * @return {number} The access code lifetime, in seconds.
   */
  remoting.HostSession.prototype.getAccessCodeLifetime = function() {
    return this.hostFacade_.getAccessCodeLifetime();
  };
  
  /**
   * Get the email address of the connected client. Valid only after the plugin
   * state is CONNECTED.
   * @return {string} The client's email address.
   */
  remoting.HostSession.prototype.getClient = function() {
    return this.hostFacade_.getClient();
  };
  
  /**
   * Disconnect the it2me session.
   * @return {void} Nothing.
   */
  remoting.HostSession.prototype.disconnect = function() {
    this.hostFacade_.disconnect();
  };
  