14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Thin wrapper for VolumeManager. This should be an interface proxy to talk
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * to VolumeManager. This class also filters Drive related data/events if
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * driveEnabled is set to false.
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {VolumeManagerWrapper.DriveEnabledStatus} driveEnabled DRIVE_ENABLED
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *     if drive should be available. DRIVE_DISABLED if drive related
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *     data/events should be hidden.
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {DOMWindow} opt_backgroundPage Window object of the background
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *     page. If this is specified, the class skips to get background page.
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *     TOOD(hirono): Let all clients of the class pass the background page and
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *     make the argument not optional.
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @constructor
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @extends {cr.EventTarget}
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)function VolumeManagerWrapper(driveEnabled, opt_backgroundPage) {
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  cr.EventTarget.call(this);
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.driveEnabled_ = driveEnabled;
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.volumeInfoList = new cr.ui.ArrayDataModel([]);
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.volumeManager_ = null;
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.pendingTasks_ = [];
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.onEventBound_ = this.onEvent_.bind(this);
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.onVolumeInfoListUpdatedBound_ =
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      this.onVolumeInfoListUpdated_.bind(this);
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.disposed_ = false;
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Start initialize the VolumeManager.
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  var queue = new AsyncUtil.Queue();
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (opt_backgroundPage) {
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.backgroundPage_ = opt_backgroundPage;
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  } else {
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    queue.run(function(callNextStep) {
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      chrome.runtime.getBackgroundPage(function(backgroundPage) {
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        this.backgroundPage_ = backgroundPage;
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        callNextStep();
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      }.bind(this));
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }.bind(this));
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  queue.run(function(callNextStep) {
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.backgroundPage_.VolumeManager.getInstance(function(volumeManager) {
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      this.onReady_(volumeManager);
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      callNextStep();
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }.bind(this));
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }.bind(this));
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * If the drive is enabled on the wrapper.
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @enum {boolean}
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)VolumeManagerWrapper.DriveEnabledStatus = {
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DRIVE_ENABLED: true,
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DRIVE_DISABLED: false
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Extends cr.EventTarget.
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)VolumeManagerWrapper.prototype.__proto__ = cr.EventTarget.prototype;
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Called when the VolumeManager gets ready for post initialization.
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {VolumeManager} volumeManager The initialized VolumeManager instance.
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @private
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)VolumeManagerWrapper.prototype.onReady_ = function(volumeManager) {
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (this.disposed_)
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.volumeManager_ = volumeManager;
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Subscribe to VolumeManager.
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.volumeManager_.addEventListener(
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'drive-connection-changed', this.onEventBound_);
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.volumeManager_.addEventListener(
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'externally-unmounted', this.onEventBound_);
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Cache volumeInfoList.
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  var volumeInfoList = [];
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (var i = 0; i < this.volumeManager_.volumeInfoList.length; i++) {
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    var volumeInfo = this.volumeManager_.volumeInfoList.item(i);
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // TODO(hidehiko): Filter mounted volumes located on Drive File System.
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!this.driveEnabled_ && volumeInfo.volumeType === util.VolumeType.DRIVE)
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      continue;
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    volumeInfoList.push(volumeInfo);
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.volumeInfoList.splice.apply(
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      this.volumeInfoList,
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      [0, this.volumeInfoList.length].concat(volumeInfoList));
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Subscribe to VolumeInfoList.
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // In VolumeInfoList, we only use 'splice' event.
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.volumeManager_.volumeInfoList.addEventListener(
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'splice', this.onVolumeInfoListUpdatedBound_);
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Run pending tasks.
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  var pendingTasks = this.pendingTasks_;
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.pendingTasks_ = null;
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (var i = 0; i < pendingTasks.length; i++)
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    pendingTasks[i]();
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Disposes the instance. After the invocation of this method, any other
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * method should not be called.
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)VolumeManagerWrapper.prototype.dispose = function() {
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.disposed_ = true;
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!this.volumeManager_)
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.volumeManager_.removeEventListener(
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'drive-connection-changed', this.onEventBound_);
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.volumeManager_.removeEventListener(
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'externally-unmounted', this.onEventBound_);
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.volumeManager_.volumeInfoList.removeEventListener(
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'splice', this.onVolumeInfoListUpdatedBound_);
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Called on events sent from VolumeManager. This has responsibility to
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * re-dispatch the event to the listeners.
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {Event} event Event object sent from VolumeManager.
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @private
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)VolumeManagerWrapper.prototype.onEvent_ = function(event) {
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!this.driveEnabled_) {
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // If the drive is disabled, ignore all drive related events.
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (event.type === 'drive-connection-changed' ||
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        (event.type === 'externally-unmounted' &&
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)         event.volumeInfo.volumeType === util.VolumeType.DRIVE))
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return;
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.dispatchEvent(event);
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Called on events of modifying VolumeInfoList.
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {Event} event Event object sent from VolumeInfoList.
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @private
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)VolumeManagerWrapper.prototype.onVolumeInfoListUpdated_ = function(event) {
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (this.driveEnabled_) {
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Apply the splice as is.
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.volumeInfoList.splice.apply(
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        this.volumeInfoList,
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        [event.index, event.removed.length].concat(event.added));
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  } else {
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Filters drive related volumes.
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    var index = event.index;
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    for (var i = 0; i < event.index; i++) {
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (this.volumeManager_.volumeInfoList.item(i).volumeType ===
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          util.VolumeType.DRIVE)
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        index--;
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    var numRemovedVolumes = 0;
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    for (var i = 0; i < event.removed.length; i++) {
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (event.removed[i].volumeType !== util.VolumeType.DRIVE)
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        numRemovedVolumes++;
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    var addedVolumes = [];
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    for (var i = 0; i < event.added.length; i++) {
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      var volumeInfo = event.added[i];
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (volumeInfo.volumeType !== util.VolumeType.DRIVE)
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        addedVolumes.push(volumeInfo);
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.volumeInfoList.splice.apply(
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        this.volumeInfoList,
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        [index, numRemovedVolumes].concat(addedVolumes));
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Ensures the VolumeManager is initialized, and then invokes callback.
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * If the VolumeManager is already initialized, callback will be called
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * immediately.
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {function()} callback Called on initialization completion.
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)VolumeManagerWrapper.prototype.ensureInitialized = function(callback) {
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (this.pendingTasks_) {
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.pendingTasks_.push(this.ensureInitialized.bind(this, callback));
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  callback();
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @return {util.DriveConnectionType} Current drive connection state.
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)VolumeManagerWrapper.prototype.getDriveConnectionState = function() {
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!this.driveEnabled_ || !this.volumeManager_) {
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return {
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      type: util.DriveConnectionType.OFFLINE,
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      reason: util.DriveConnectionReason.NO_SERVICE
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    };
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return this.volumeManager_.getDriveConnectionState();
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {string} mountPath The path to mount location of the volume.
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @return {VolumeInfo} The VolumeInfo instance for the volume mounted at
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *     mountPath, or null if no volume is found
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)VolumeManagerWrapper.prototype.getVolumeInfo = function(mountPath) {
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return this.filterDisabledDriveVolume_(
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      this.volumeManager_ && this.volumeManager_.getVolumeInfo(mountPath));
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Obtains a volume information from a file entry URL.
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * TODO(hirono): Check a file system to find a volume.
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {string} url URL of entry.
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {VolumeInfo} Volume info.
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)VolumeManagerWrapper.prototype.getVolumeInfoByURL = function(url) {
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return this.filterDisabledDriveVolume_(
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      this.volumeManager_ && this.volumeManager_.getVolumeInfoByURL(url));
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Obtains a volume infomration of the current profile.
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {util.VolumeType} volumeType Volume type.
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {VolumeInfo} Found volume info.
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)VolumeManagerWrapper.prototype.getCurrentProfileVolumeInfo =
244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    function(volumeType) {
245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return this.filterDisabledDriveVolume_(
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      this.volumeManager_ &&
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      this.volumeManager_.getCurrentProfileVolumeInfo(volumeType));
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Obtains location information from an entry.
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *
253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @param {Entry} entry File or directory entry.
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @return {EntryLocation} Location information.
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)VolumeManagerWrapper.prototype.getLocationInfo = function(entry) {
257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return this.volumeManager_ && this.volumeManager_.getLocationInfo(entry);
258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/**
2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Requests to mount the archive file.
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {string} fileUrl The path to the archive file to be mounted.
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {function(string)} successCallback Called with mount path on success.
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {function(util.VolumeError)} errorCallback Called when an error
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *     occurs.
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)VolumeManagerWrapper.prototype.mountArchive = function(
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    fileUrl, successCallback, errorCallback) {
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (this.pendingTasks_) {
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.pendingTasks_.push(
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        this.mountArchive.bind(this, fileUrl, successCallback, errorCallback));
2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.volumeManager_.mountArchive(fileUrl, successCallback, errorCallback);
2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Requests unmount the volume at mountPath.
2804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {string} mountPath The path to the mount location of the volume.
2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {function(string)} successCallback Called with the mount path
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *     on success.
2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {function(util.VolumeError)} errorCallback Called when an error
2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *     occurs.
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)VolumeManagerWrapper.prototype.unmount = function(
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    mountPath, successCallback, errorCallback) {
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (this.pendingTasks_) {
2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.pendingTasks_.push(
2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        this.unmount.bind(this, mountPath, successCallback, errorCallback));
2914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.volumeManager_.unmount(mountPath, successCallback, errorCallback);
2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Resolves the absolute path to an entry instance.
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {string} path The path to be resolved.
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {function(Entry)} successCallback Called with the resolved entry
3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *     on success.
3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {function(FileError)} errorCallback Called with the error on error.
3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)VolumeManagerWrapper.prototype.resolveAbsolutePath = function(
3054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    path, successCallback, errorCallback) {
3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (this.pendingTasks_) {
307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    this.pendingTasks_.push(this.resolveAbsolutePath.bind(
308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        this, path, successCallback, errorCallback));
3094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // If the drive is disabled, any resolving the path under drive should be
3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // failed.
3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!this.driveEnabled_ && PathUtil.isDriveBasedPath(path)) {
3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    errorCallback(util.createFileError(FileError.NOT_FOUND_ERR));
3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
3174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  this.volumeManager_.resolveAbsolutePath(path, successCallback, errorCallback);
320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/**
323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Filters volume info by referring driveEnabled.
324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *
325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @param {VolumeInfo} volumeInfo Volume info.
326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return {VolumeInfo} Null if the drive is disabled and the given volume is
327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *     drive. Otherwise just returns the volume.
328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @private
329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)VolumeManagerWrapper.prototype.filterDisabledDriveVolume_ =
331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    function(volumeInfo) {
332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  var isDrive = volumeInfo && volumeInfo.volumeType === util.VolumeType.DRIVE;
333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return this.driveEnabled_ || !isDrive ? volumeInfo : null;
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
335