| Index: chrome/browser/resources/file_manager/js/file_copy_manager.js
|
| ===================================================================
|
| --- chrome/browser/resources/file_manager/js/file_copy_manager.js (revision 126484)
|
| +++ chrome/browser/resources/file_manager/js/file_copy_manager.js (working copy)
|
| @@ -448,6 +448,14 @@
|
| errorCallback(new FileCopyManager.Error(reason, data));
|
| }
|
|
|
| + function onFilesystemCopyComplete(entry) {
|
| + // TODO(benchan): We currently do not know the size of data being
|
| + // copied by FileEntry.copyTo(), so task.completedBytes will not be
|
| + // increased. We will address this issue once we need to use
|
| + // task.completedBytes to track the progress.
|
| + onCopyComplete(entry, 0);
|
| + }
|
| +
|
| function onFilesystemError(err) {
|
| onError('FILESYSTEM_ERROR', err);
|
| }
|
| @@ -464,6 +472,52 @@
|
| }
|
| }
|
|
|
| + /**
|
| + * Resolves the immediate parent directory entry and the file name of a
|
| + * given path, where the path is specified by a directory (not necessarily
|
| + * the immediate parent) and a path (not necessarily the file name) related
|
| + * to that directory. For instance,
|
| + * Given:
|
| + * |dirEntry| = DirectoryEntry('/root/dir1')
|
| + * |relativePath| = 'dir2/file'
|
| + *
|
| + * Return:
|
| + * |parentDirEntry| = DirectoryEntry('/root/dir1/dir2')
|
| + * |fileName| = 'file'
|
| + *
|
| + * @param {DirectoryEntry} dirEntry A directory entry.
|
| + * @param {string} relativePath A path relative to |dirEntry|.
|
| + * @param {function(Entry,string)} A callback for returning the
|
| + * |parentDirEntry| and |fileName| upon success.
|
| + * @param {function(FileError)} An error callback when there is an error
|
| + * getting |parentDirEntry|.
|
| + */
|
| + function resolveDirAndBaseName(dirEntry, relativePath,
|
| + successCallback, errorCallback) {
|
| + // |intermediatePath| contains the intermediate path components
|
| + // that are appended to |dirEntry| to form |parentDirEntry|.
|
| + var intermediatePath = '';
|
| + var fileName = relativePath;
|
| +
|
| + // Extract the file name component from |relativePath|.
|
| + var index = relativePath.lastIndexOf('/');
|
| + if (index != -1) {
|
| + intermediatePath = relativePath.substr(0, index);
|
| + fileName = relativePath.substr(index + 1);
|
| + }
|
| +
|
| + if (intermediatePath == '') {
|
| + successCallback(dirEntry, fileName);
|
| + } else {
|
| + dirEntry.getDirectory(intermediatePath,
|
| + {create: false},
|
| + function(entry) {
|
| + successCallback(entry, fileName);
|
| + },
|
| + errorCallback);
|
| + }
|
| + }
|
| +
|
| function onTargetNotResolved(err) {
|
| // We expect to be unable to resolve the target file, since we're going
|
| // to create it during the copy. However, if the resolve fails with
|
| @@ -473,16 +527,26 @@
|
|
|
| if (task.sourceAndTargetOnGData) {
|
| if (task.deleteAfterCopy) {
|
| - sourceEntry.moveTo(targetDirEntry, targetRelativePath,
|
| - onCopyComplete, onError);
|
| + resolveDirAndBaseName(
|
| + targetDirEntry, targetRelativePath,
|
| + function(dirEntry, fileName) {
|
| + sourceEntry.moveTo(dirEntry, fileName,
|
| + onFilesystemCopyComplete, onFilesystemError);
|
| + },
|
| + onFilesystemError);
|
| return;
|
| } else {
|
| // TODO(benchan): GDataFileSystem has not implemented directory copy,
|
| // and thus we only call FileEntry.copyTo() for files. Revisit this
|
| // code when GDataFileSystem supports directory copy.
|
| if (!sourceEntry.isDirectory) {
|
| - sourceEntry.copyTo(targetDirEntry, targetRelativePath,
|
| - onCopyComplete, onError);
|
| + resolveDirAndBaseName(
|
| + targetDirEntry, targetRelativePath,
|
| + function(dirEntry, fileName) {
|
| + sourceEntry.copyTo(dirEntry, fileName,
|
| + onFilesystemCopyComplete, onFilesystemError);
|
| + },
|
| + onFilesystemError);
|
| return;
|
| }
|
| }
|
|
|