Source: platform/platform.js

/**
 * Copyright© 2016, Oracle and/or its affiliates. All rights reserved.
 */


/**
 * Base class for platform-specific capabilities. Users may derive from this class to
 * provide implementations specific to their platform.
 * @constructor
 * @abstract
 * @global
 */
function Platform(logger, utils) {

  var _deviceId = utils.uuid();

  this._deviceState = deviceState.unrestricted;
  this._deviceStateChangedCallbacks = [];

  /**
   * Returns a device ID used by [Diagnostics]{@link Diagnostics}.
   * @returns {String} The device ID.
   */
  this.getDeviceId = function() {
    return _deviceId;
  };

  this.initGPSLocation = function () {};

  /**
   * Sets the current state of the device. Platform implementations should call this function
   * when the state changes. The state is inspected before background operations
   * like synchronization are performed.
   * @param state {mcs.deviceState} The new state of the device.
   */
  this.setDeviceState = function(state) {
    if(this._deviceState != state) {

      logger.info("Device state changing from " + this._deviceState + " to " + state);

      this._deviceState = state;

      for(var i=0; i<this._deviceStateChangedCallbacks.length; i++) {
        this._deviceStateChangedCallbacks[i](this._deviceState);
      }
    }
  };
}

/**
 * Class that provides the current GPS location of the device.
 * @typedef {Object} Platform~GPSLocation
 * @property {String} latitude - The device's current latitude.
 * @property {String} longitude - The device's current longitude.
 */

/**
 * Returns an object that has the current GPS location of the device or null.
 * @returns {Platform~GPSLocation} The GPS location is available.
 */
Platform.prototype.getGPSLocation = function() {
  return {
    "latitude": null,
    "longitude": null
  };
};

/**
 * Class that provides information about the device.
 * @typedef {Object} Platform~DeviceInformation
 * @property {String} model - The device's model.
 * @property {String} manufacturer - The device's manufacturer.
 * @property {String} osName - The operating system.
 * @property {String} osVersion - The operating system's version.
 * @property {String} osBuild - The operating system's build number.
 * @property {String} carrier - The device's wireless carrier.
 */

/**
 * Returns an object with device information used by [Analytics]{@link Analytics}
 * @returns {Platform~DeviceInformation} The device specific information.
 */
Platform.prototype.getDeviceInformation = function() {
  return {
    "model": "<unknown>",
    "manufacturer": "<unknown>",
    "osName": "<unknown>",
    "osVersion": "<unknown>",
    "osBuild": "<unknown>",
    "carrier": "<unknown>"
  };
};

/**
 * Performs an HTTP request.
 * @param request {Object} The format of the request parameter is identical to the settings parameter in
 * [JQuery's ajax]{@link http://api.jquery.com/jQuery.ajax/} method. However, only the method, url, headers ,data, success
 * and error properties are used.
 * @abstract
 */
Platform.prototype.invokeService = function(request) {
  throw Error("invokeService() not implemented in Platform!");
};

/**
 * Implementors can override this function to allow offline login. [cacheCredentials()]{Platform#cacheCredentials}
 * Should also be overridden to cache the credentials. The default implementation returns false.
 *
 * @param username {String} The user name.
 * @param password {String} The password.
 * @returns {Boolean} True if the username and password are valid, false otherwise.
 */
Platform.prototype.validateCachedCredentials = function(username, password) {
  return false;
};

/**
 * Implementors can override this function to cache user credentials for offline login. The default implementation
 * is a no-op.
 * @param username {String} The user name.
 * @param password {String} The password.
 */
Platform.prototype.cacheCredentials = function(username, password) {
  throw Error("cacheCredentials() not implemented in Platform!");
};