Index: chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc |
diff --git a/chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc b/chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc |
index 2245ba6f6a3746a1e431e052432a3e4fcad0878a..c106f65417ded470ee026eeda78e4e847d6a9852 100644 |
--- a/chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc |
+++ b/chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc |
@@ -79,6 +79,13 @@ void OnReadDirectoryError(const AsyncFileUtil::ReadDirectoryCallback& callback, |
callback.Run(error, AsyncFileUtil::EntryList(), false /*no more*/); |
} |
+// Called when CopyInForeignFile method call failed. |
+void OnCopyInForeignFileError(const AsyncFileUtil::StatusCallback& callback, |
+ base::File::Error error) { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
+ callback.Run(error); |
+} |
+ |
// Called on a blocking pool thread to create a snapshot file to hold the |
// contents of |device_file_path|. The snapshot file is created in the |
// "profile_path/kDeviceMediaAsyncFileUtilTempDir" directory. Return the |
@@ -330,6 +337,7 @@ void DeviceMediaAsyncFileUtil::ReadDirectory( |
OnReadDirectoryError(callback, base::File::FILE_ERROR_NOT_FOUND); |
return; |
} |
+ |
delegate->ReadDirectory( |
url.path(), |
base::Bind(&DeviceMediaAsyncFileUtil::OnDidReadDirectory, |
@@ -389,8 +397,22 @@ void DeviceMediaAsyncFileUtil::CopyInForeignFile( |
const FileSystemURL& dest_url, |
const StatusCallback& callback) { |
DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
- NOTIMPLEMENTED(); |
- callback.Run(base::File::FILE_ERROR_SECURITY); |
+ |
+ MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(dest_url); |
+ if (!delegate) { |
+ OnCopyInForeignFileError(callback, base::File::FILE_ERROR_NOT_FOUND); |
+ return; |
+ } |
+ if (delegate->IsReadOnly()) { |
+ OnCopyInForeignFileError(callback, base::File::FILE_ERROR_SECURITY); |
+ return; |
+ } |
+ |
+ delegate->CopyFileFromLocal( |
+ src_file_path, dest_url.path(), |
+ base::Bind(&DeviceMediaAsyncFileUtil::OnDidCopyInForeignFile, |
+ weak_ptr_factory_.GetWeakPtr(), callback), |
+ base::Bind(&OnCopyInForeignFileError, callback)); |
} |
void DeviceMediaAsyncFileUtil::DeleteFile( |
@@ -511,6 +533,13 @@ void DeviceMediaAsyncFileUtil::OnDidReadDirectory( |
base::Bind(&OnDidCheckMediaForReadDirectory, callback, has_more)); |
} |
+void DeviceMediaAsyncFileUtil::OnDidCopyInForeignFile( |
+ const StatusCallback& callback) { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
+ |
+ callback.Run(base::File::FILE_OK); |
+} |
+ |
bool DeviceMediaAsyncFileUtil::validate_media_files() const { |
return media_path_filter_wrapper_.get() != NULL; |
} |