blob: 5677b01f153dd50ff5fcf3b35cd09d0f1175f749 [file] [log] [blame]
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +01001// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/media_galleries/fileapi/device_media_async_file_util.h"
6
7#include "base/callback.h"
8#include "base/file_util.h"
9#include "base/single_thread_task_runner.h"
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010010#include "base/task_runner_util.h"
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010011#include "chrome/browser/media_galleries/fileapi/media_path_filter.h"
12#include "chrome/browser/media_galleries/fileapi/mtp_device_async_delegate.h"
13#include "chrome/browser/media_galleries/fileapi/mtp_device_map_service.h"
Torne (Richard Coles)a93a17c2013-05-15 11:34:50 +010014#include "chrome/browser/media_galleries/fileapi/native_media_file_util.h"
Ben Murdochbbcdd452013-07-25 10:06:34 +010015#include "content/public/browser/browser_thread.h"
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010016#include "webkit/browser/fileapi/file_system_operation_context.h"
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010017#include "webkit/browser/fileapi/file_system_url.h"
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010018#include "webkit/common/blob/shareable_file_reference.h"
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010019
20using fileapi::FileSystemOperationContext;
21using fileapi::FileSystemURL;
22using webkit_blob::ShareableFileReference;
23
24namespace chrome {
25
26namespace {
27
Ben Murdochbbcdd452013-07-25 10:06:34 +010028const char kDeviceMediaAsyncFileUtilTempDir[] = "DeviceMediaFileSystem";
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010029
30// Called on the IO thread.
Ben Murdochbb1529c2013-08-08 10:24:53 +010031MTPDeviceAsyncDelegate* GetMTPDeviceDelegate(const FileSystemURL& url) {
Ben Murdochbbcdd452013-07-25 10:06:34 +010032 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010033 return MTPDeviceMapService::GetInstance()->GetMTPDeviceAsyncDelegate(
Ben Murdochbb1529c2013-08-08 10:24:53 +010034 url.filesystem_id());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010035}
36
37// Called on a blocking pool thread to create a snapshot file to hold the
38// contents of |device_file_path|. The snapshot file is created in
39// "profile_path/kDeviceMediaAsyncFileUtilTempDir" directory. If the snapshot
40// file is created successfully, |snapshot_file_path| will be a non-empty file
41// path. In case of failure, the |snapshot_file_path| will be an empty file
42// path.
43void CreateSnapshotFileOnBlockingPool(
44 const base::FilePath& device_file_path,
45 const base::FilePath& profile_path,
46 base::FilePath* snapshot_file_path) {
47 DCHECK(snapshot_file_path);
48 base::FilePath isolated_media_file_system_dir_path =
Ben Murdochbbcdd452013-07-25 10:06:34 +010049 profile_path.AppendASCII(kDeviceMediaAsyncFileUtilTempDir);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010050 if (!file_util::CreateDirectory(isolated_media_file_system_dir_path) ||
51 !file_util::CreateTemporaryFileInDir(isolated_media_file_system_dir_path,
52 snapshot_file_path)) {
53 LOG(WARNING) << "Could not create media snapshot file "
54 << isolated_media_file_system_dir_path.value();
55 *snapshot_file_path = base::FilePath();
56 }
57}
58
59} // namespace
60
61DeviceMediaAsyncFileUtil::~DeviceMediaAsyncFileUtil() {
62}
63
64// static
65DeviceMediaAsyncFileUtil* DeviceMediaAsyncFileUtil::Create(
66 const base::FilePath& profile_path) {
67 DCHECK(!profile_path.empty());
68 return new DeviceMediaAsyncFileUtil(profile_path);
69}
70
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010071void DeviceMediaAsyncFileUtil::CreateOrOpen(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010072 scoped_ptr<FileSystemOperationContext> context,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010073 const FileSystemURL& url,
74 int file_flags,
75 const CreateOrOpenCallback& callback) {
Ben Murdochbbcdd452013-07-25 10:06:34 +010076 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010077 NOTIMPLEMENTED();
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010078 base::PlatformFile invalid_file = base::kInvalidPlatformFileValue;
79 callback.Run(base::PLATFORM_FILE_ERROR_SECURITY,
80 base::PassPlatformFile(&invalid_file),
81 base::Closure());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010082}
83
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010084void DeviceMediaAsyncFileUtil::EnsureFileExists(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010085 scoped_ptr<FileSystemOperationContext> context,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010086 const FileSystemURL& url,
87 const EnsureFileExistsCallback& callback) {
Ben Murdochbbcdd452013-07-25 10:06:34 +010088 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010089 NOTIMPLEMENTED();
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010090 callback.Run(base::PLATFORM_FILE_ERROR_SECURITY, false);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010091}
92
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010093void DeviceMediaAsyncFileUtil::CreateDirectory(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010094 scoped_ptr<FileSystemOperationContext> context,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010095 const FileSystemURL& url,
96 bool exclusive,
97 bool recursive,
98 const StatusCallback& callback) {
Ben Murdochbbcdd452013-07-25 10:06:34 +010099 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100100 NOTIMPLEMENTED();
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100101 callback.Run(base::PLATFORM_FILE_ERROR_SECURITY);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100102}
103
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100104void DeviceMediaAsyncFileUtil::GetFileInfo(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100105 scoped_ptr<FileSystemOperationContext> context,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100106 const FileSystemURL& url,
107 const GetFileInfoCallback& callback) {
Ben Murdochbbcdd452013-07-25 10:06:34 +0100108 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Ben Murdochbb1529c2013-08-08 10:24:53 +0100109 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100110 if (!delegate) {
Ben Murdochbbcdd452013-07-25 10:06:34 +0100111 OnGetFileInfoError(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND);
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100112 return;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100113 }
114 delegate->GetFileInfo(
115 url.path(),
116 base::Bind(&DeviceMediaAsyncFileUtil::OnDidGetFileInfo,
117 weak_ptr_factory_.GetWeakPtr(),
Ben Murdochbbcdd452013-07-25 10:06:34 +0100118 callback),
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100119 base::Bind(&DeviceMediaAsyncFileUtil::OnGetFileInfoError,
120 weak_ptr_factory_.GetWeakPtr(),
Ben Murdochbbcdd452013-07-25 10:06:34 +0100121 callback));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100122}
123
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100124void DeviceMediaAsyncFileUtil::ReadDirectory(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100125 scoped_ptr<FileSystemOperationContext> context,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100126 const FileSystemURL& url,
127 const ReadDirectoryCallback& callback) {
Ben Murdochbbcdd452013-07-25 10:06:34 +0100128 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Ben Murdochbb1529c2013-08-08 10:24:53 +0100129 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100130 if (!delegate) {
131 OnReadDirectoryError(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND);
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100132 return;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100133 }
134 delegate->ReadDirectory(
135 url.path(),
136 base::Bind(&DeviceMediaAsyncFileUtil::OnDidReadDirectory,
137 weak_ptr_factory_.GetWeakPtr(),
138 callback),
139 base::Bind(&DeviceMediaAsyncFileUtil::OnReadDirectoryError,
140 weak_ptr_factory_.GetWeakPtr(),
141 callback));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100142}
143
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100144void DeviceMediaAsyncFileUtil::Touch(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100145 scoped_ptr<FileSystemOperationContext> context,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100146 const FileSystemURL& url,
147 const base::Time& last_access_time,
148 const base::Time& last_modified_time,
149 const StatusCallback& callback) {
Ben Murdochbbcdd452013-07-25 10:06:34 +0100150 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100151 NOTIMPLEMENTED();
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100152 callback.Run(base::PLATFORM_FILE_ERROR_SECURITY);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100153}
154
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100155void DeviceMediaAsyncFileUtil::Truncate(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100156 scoped_ptr<FileSystemOperationContext> context,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100157 const FileSystemURL& url,
158 int64 length,
159 const StatusCallback& callback) {
Ben Murdochbbcdd452013-07-25 10:06:34 +0100160 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100161 NOTIMPLEMENTED();
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100162 callback.Run(base::PLATFORM_FILE_ERROR_SECURITY);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100163}
164
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100165void DeviceMediaAsyncFileUtil::CopyFileLocal(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100166 scoped_ptr<FileSystemOperationContext> context,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100167 const FileSystemURL& src_url,
168 const FileSystemURL& dest_url,
169 const StatusCallback& callback) {
Ben Murdochbbcdd452013-07-25 10:06:34 +0100170 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100171 NOTIMPLEMENTED();
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100172 callback.Run(base::PLATFORM_FILE_ERROR_SECURITY);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100173}
174
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100175void DeviceMediaAsyncFileUtil::MoveFileLocal(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100176 scoped_ptr<FileSystemOperationContext> context,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100177 const FileSystemURL& src_url,
178 const FileSystemURL& dest_url,
179 const StatusCallback& callback) {
Ben Murdochbbcdd452013-07-25 10:06:34 +0100180 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100181 NOTIMPLEMENTED();
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100182 callback.Run(base::PLATFORM_FILE_ERROR_SECURITY);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100183}
184
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100185void DeviceMediaAsyncFileUtil::CopyInForeignFile(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100186 scoped_ptr<FileSystemOperationContext> context,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100187 const base::FilePath& src_file_path,
188 const FileSystemURL& dest_url,
189 const StatusCallback& callback) {
Ben Murdochbbcdd452013-07-25 10:06:34 +0100190 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100191 NOTIMPLEMENTED();
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100192 callback.Run(base::PLATFORM_FILE_ERROR_SECURITY);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100193}
194
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100195void DeviceMediaAsyncFileUtil::DeleteFile(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100196 scoped_ptr<FileSystemOperationContext> context,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100197 const FileSystemURL& url,
198 const StatusCallback& callback) {
Ben Murdochbbcdd452013-07-25 10:06:34 +0100199 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100200 NOTIMPLEMENTED();
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100201 callback.Run(base::PLATFORM_FILE_ERROR_SECURITY);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100202}
203
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100204void DeviceMediaAsyncFileUtil::DeleteDirectory(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100205 scoped_ptr<FileSystemOperationContext> context,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100206 const FileSystemURL& url,
207 const StatusCallback& callback) {
Ben Murdochbbcdd452013-07-25 10:06:34 +0100208 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100209 NOTIMPLEMENTED();
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100210 callback.Run(base::PLATFORM_FILE_ERROR_SECURITY);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100211}
212
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100213void DeviceMediaAsyncFileUtil::DeleteRecursively(
Ben Murdocheb525c52013-07-10 11:40:50 +0100214 scoped_ptr<FileSystemOperationContext> context,
215 const FileSystemURL& url,
216 const StatusCallback& callback) {
Ben Murdochbbcdd452013-07-25 10:06:34 +0100217 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100218 callback.Run(base::PLATFORM_FILE_ERROR_INVALID_OPERATION);
Ben Murdocheb525c52013-07-10 11:40:50 +0100219}
220
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100221void DeviceMediaAsyncFileUtil::CreateSnapshotFile(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100222 scoped_ptr<FileSystemOperationContext> context,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100223 const FileSystemURL& url,
224 const CreateSnapshotFileCallback& callback) {
Ben Murdochbbcdd452013-07-25 10:06:34 +0100225 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Ben Murdochbb1529c2013-08-08 10:24:53 +0100226 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100227 if (!delegate) {
228 OnCreateSnapshotFileError(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND);
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100229 return;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100230 }
231 base::FilePath* snapshot_file_path = new base::FilePath;
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100232 base::SequencedTaskRunner* task_runner = context->task_runner();
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100233 const bool success = task_runner->PostTaskAndReply(
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100234 FROM_HERE,
235 base::Bind(&CreateSnapshotFileOnBlockingPool,
236 url.path(),
237 profile_path_,
238 base::Unretained(snapshot_file_path)),
239 base::Bind(&DeviceMediaAsyncFileUtil::OnSnapshotFileCreatedRunTask,
240 weak_ptr_factory_.GetWeakPtr(),
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100241 base::Passed(&context),
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100242 callback,
Ben Murdochbb1529c2013-08-08 10:24:53 +0100243 url,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100244 base::Owned(snapshot_file_path)));
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100245 DCHECK(success);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100246}
247
248DeviceMediaAsyncFileUtil::DeviceMediaAsyncFileUtil(
249 const base::FilePath& profile_path)
250 : profile_path_(profile_path),
251 weak_ptr_factory_(this) {
252}
253
254void DeviceMediaAsyncFileUtil::OnDidGetFileInfo(
255 const AsyncFileUtil::GetFileInfoCallback& callback,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100256 const base::PlatformFileInfo& file_info) {
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100257 callback.Run(base::PLATFORM_FILE_OK, file_info);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100258}
259
260void DeviceMediaAsyncFileUtil::OnGetFileInfoError(
261 const AsyncFileUtil::GetFileInfoCallback& callback,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100262 base::PlatformFileError error) {
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100263 callback.Run(error, base::PlatformFileInfo());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100264}
265
266void DeviceMediaAsyncFileUtil::OnDidReadDirectory(
267 const AsyncFileUtil::ReadDirectoryCallback& callback,
268 const AsyncFileUtil::EntryList& file_list,
269 bool has_more) {
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100270 callback.Run(base::PLATFORM_FILE_OK, file_list, has_more);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100271}
272
273void DeviceMediaAsyncFileUtil::OnReadDirectoryError(
274 const AsyncFileUtil::ReadDirectoryCallback& callback,
275 base::PlatformFileError error) {
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100276 callback.Run(error, AsyncFileUtil::EntryList(), false /*no more*/);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100277}
278
279void DeviceMediaAsyncFileUtil::OnDidCreateSnapshotFile(
280 const AsyncFileUtil::CreateSnapshotFileCallback& callback,
281 base::SequencedTaskRunner* media_task_runner,
282 const base::PlatformFileInfo& file_info,
283 const base::FilePath& platform_path) {
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100284 base::PostTaskAndReplyWithResult(
285 media_task_runner,
286 FROM_HERE,
287 base::Bind(&NativeMediaFileUtil::IsMediaFile, platform_path),
288 base::Bind(&DeviceMediaAsyncFileUtil::OnDidCheckMedia,
289 weak_ptr_factory_.GetWeakPtr(),
290 callback,
291 file_info,
292 ShareableFileReference::GetOrCreate(
293 platform_path,
294 ShareableFileReference::DELETE_ON_FINAL_RELEASE,
295 media_task_runner)));
Torne (Richard Coles)a93a17c2013-05-15 11:34:50 +0100296}
297
298void DeviceMediaAsyncFileUtil::OnDidCheckMedia(
299 const AsyncFileUtil::CreateSnapshotFileCallback& callback,
Torne (Richard Coles)a93a17c2013-05-15 11:34:50 +0100300 const base::PlatformFileInfo& file_info,
301 scoped_refptr<webkit_blob::ShareableFileReference> platform_file,
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100302 base::PlatformFileError error) {
Torne (Richard Coles)a93a17c2013-05-15 11:34:50 +0100303 base::FilePath platform_path(platform_file.get()->path());
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100304 if (error != base::PLATFORM_FILE_OK)
Torne (Richard Coles)a93a17c2013-05-15 11:34:50 +0100305 platform_file = NULL;
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100306 callback.Run(error, file_info, platform_path, platform_file);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100307}
308
309void DeviceMediaAsyncFileUtil::OnCreateSnapshotFileError(
310 const AsyncFileUtil::CreateSnapshotFileCallback& callback,
311 base::PlatformFileError error) {
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100312 callback.Run(error, base::PlatformFileInfo(), base::FilePath(),
313 scoped_refptr<ShareableFileReference>());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100314}
315
316void DeviceMediaAsyncFileUtil::OnSnapshotFileCreatedRunTask(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100317 scoped_ptr<FileSystemOperationContext> context,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100318 const AsyncFileUtil::CreateSnapshotFileCallback& callback,
Ben Murdochbb1529c2013-08-08 10:24:53 +0100319 const FileSystemURL& url,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100320 base::FilePath* snapshot_file_path) {
Ben Murdochbbcdd452013-07-25 10:06:34 +0100321 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100322 if (!snapshot_file_path || snapshot_file_path->empty()) {
323 OnCreateSnapshotFileError(callback, base::PLATFORM_FILE_ERROR_FAILED);
324 return;
325 }
Ben Murdochbb1529c2013-08-08 10:24:53 +0100326 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100327 if (!delegate) {
328 OnCreateSnapshotFileError(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND);
329 return;
330 }
331 delegate->CreateSnapshotFile(
Ben Murdochbb1529c2013-08-08 10:24:53 +0100332 url.path(), // device file path
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100333 *snapshot_file_path,
334 base::Bind(&DeviceMediaAsyncFileUtil::OnDidCreateSnapshotFile,
335 weak_ptr_factory_.GetWeakPtr(),
336 callback,
337 make_scoped_refptr(context->task_runner())),
338 base::Bind(&DeviceMediaAsyncFileUtil::OnCreateSnapshotFileError,
339 weak_ptr_factory_.GetWeakPtr(),
340 callback));
341}
342
343} // namespace chrome