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