// Copyright (c) 2011 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. /** * Namespace for utility functions. */ var util = { /** * Returns a function that console.log's its arguments, prefixed by |msg|. * * @param {string} msg The message prefix to use in the log. * @param {function(*)} opt_callback A function to invoke after logging. */ flog: function(msg, opt_callback) { return function() { var ary = Array.apply(null, arguments); console.log(msg + ': ' + ary.join(', ')); if (opt_callback) opt_callback.call(arguments); }; }, /** * Returns a function that throws an exception that includes its arguments * prefixed by |msg|. * * @param {string} msg The message prefix to use in the exception. */ ferr: function(msg) { return function() { var ary = Array.apply(null, arguments); throw new Error(msg + ': ' + ary.join(', ')); }; }, /** * Install a sensible toString() on the FileError object. * * FileError.prototype.code is a numeric code describing the cause of the * error. The FileError constructor has a named property for each possible * error code, but provides no way to map the code to the named property. * This toString() implementation fixes that. */ installFileErrorToString: function() { FileError.prototype.toString = function() { return '[object FileError: ' + util.getFileErrorMnemonic(this.code) + ']'; } }, getFileErrorMnemonic: function(code) { for (var key in FileError) { if (key.search(/_ERR$/) != -1 && FileError[key] == code) return key; } return code; }, /** * Utility function to invoke callback once for each entry in dirEntry. * * @param {DirectoryEntry} dirEntry The directory entry to enumerate. * @param {function(Entry)} callback The function to invoke for each entry in * dirEntry. */ forEachDirEntry: function(dirEntry, callback) { var reader; function onReadSome(results) { if (results.length == 0) return callback(null); for (var i = 0; i < results.length; i++) callback(results[i]); reader.readEntries(onReadSome); }; reader = dirEntry.createReader(); reader.readEntries(onReadSome); }, /** * Utility function to resolve multiple directories with a single call. * * The successCallback will be invoked once for each directory object * found. The errorCallback will be invoked once for each * path that could not be resolved. * * The successCallback is invoked with a null entry when all paths have * been processed. * * @param {DirEntry} dirEntry The base directory. * @param {Object} params The parameters to pass to the underlying * getDirectory calls. * @param {Array<string>} paths The list of directories to resolve. * @param {function(!DirEntry)} successCallback The function to invoke for * each DirEntry found. Also invoked once with null at the end of the * process. * @param {function(string, FileError)} errorCallback The function to invoke * for each path that cannot be resolved. */ getDirectories: function(dirEntry, params, paths, successCallback, errorCallback) { // Copy the params array, since we're going to destroy it. params = [].slice.call(params); function onComplete() { successCallback(null); } function getNextDirectory() { var path = paths.shift(); if (!path) return onComplete(); dirEntry.getDirectory( path, params, function(entry) { successCallback(entry); getNextDirectory(); }, function(err) { errorCallback(path, err); getNextDirectory(); }); } getNextDirectory(); }, };