OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/media_galleries/fileapi/device_media_async_file_util.h" | 5 #include "chrome/browser/media_galleries/fileapi/device_media_async_file_util.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/single_thread_task_runner.h" | 9 #include "base/single_thread_task_runner.h" |
10 #include "base/task_runner_util.h" | 10 #include "base/task_runner_util.h" |
11 #include "chrome/browser/media_galleries/fileapi/media_path_filter.h" | 11 #include "chrome/browser/media_galleries/fileapi/media_path_filter.h" |
12 #include "chrome/browser/media_galleries/fileapi/mtp_device_async_delegate.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" | 13 #include "chrome/browser/media_galleries/fileapi/mtp_device_map_service.h" |
14 #include "chrome/browser/media_galleries/fileapi/mtp_file_stream_reader.h" | 14 #include "chrome/browser/media_galleries/fileapi/mtp_file_stream_reader.h" |
15 #include "chrome/browser/media_galleries/fileapi/native_media_file_util.h" | 15 #include "chrome/browser/media_galleries/fileapi/native_media_file_util.h" |
16 #include "chrome/browser/media_galleries/fileapi/readahead_file_stream_reader.h" | 16 #include "chrome/browser/media_galleries/fileapi/readahead_file_stream_reader.h" |
17 #include "content/public/browser/browser_thread.h" | 17 #include "content/public/browser/browser_thread.h" |
18 #include "webkit/browser/blob/file_stream_reader.h" | 18 #include "webkit/browser/blob/file_stream_reader.h" |
19 #include "webkit/browser/fileapi/file_system_context.h" | 19 #include "webkit/browser/fileapi/file_system_context.h" |
20 #include "webkit/browser/fileapi/file_system_operation_context.h" | 20 #include "webkit/browser/fileapi/file_system_operation_context.h" |
21 #include "webkit/browser/fileapi/file_system_url.h" | 21 #include "webkit/browser/fileapi/file_system_url.h" |
22 #include "webkit/browser/fileapi/native_file_util.h" | 22 #include "webkit/browser/fileapi/native_file_util.h" |
23 #include "webkit/common/blob/shareable_file_reference.h" | 23 #include "webkit/common/blob/shareable_file_reference.h" |
24 | 24 |
| 25 using fileapi::AsyncFileUtil; |
25 using fileapi::FileSystemOperationContext; | 26 using fileapi::FileSystemOperationContext; |
26 using fileapi::FileSystemURL; | 27 using fileapi::FileSystemURL; |
27 using webkit_blob::ShareableFileReference; | 28 using webkit_blob::ShareableFileReference; |
28 | 29 |
29 namespace { | 30 namespace { |
30 | 31 |
31 const char kDeviceMediaAsyncFileUtilTempDir[] = "DeviceMediaFileSystem"; | 32 const char kDeviceMediaAsyncFileUtilTempDir[] = "DeviceMediaFileSystem"; |
32 | 33 |
33 // Called on the IO thread. | |
34 MTPDeviceAsyncDelegate* GetMTPDeviceDelegate(const FileSystemURL& url) { | 34 MTPDeviceAsyncDelegate* GetMTPDeviceDelegate(const FileSystemURL& url) { |
35 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 35 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
36 return MTPDeviceMapService::GetInstance()->GetMTPDeviceAsyncDelegate( | 36 return MTPDeviceMapService::GetInstance()->GetMTPDeviceAsyncDelegate( |
37 url.filesystem_id()); | 37 url.filesystem_id()); |
38 } | 38 } |
39 | 39 |
| 40 // Called when GetFileInfo method call failed to get the details of file |
| 41 // specified by the requested url. |callback| is invoked to notify the |
| 42 // caller about the file |error|. |
| 43 void OnGetFileInfoError(const AsyncFileUtil::GetFileInfoCallback& callback, |
| 44 base::File::Error error) { |
| 45 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 46 callback.Run(error, base::File::Info()); |
| 47 } |
| 48 |
| 49 // Called when ReadDirectory method call failed to enumerate the directory |
| 50 // objects. |callback| is invoked to notify the caller about the |error| |
| 51 // that occured while reading the directory objects. |
| 52 void OnReadDirectoryError(const AsyncFileUtil::ReadDirectoryCallback& callback, |
| 53 base::File::Error error) { |
| 54 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 55 callback.Run(error, AsyncFileUtil::EntryList(), false /*no more*/); |
| 56 } |
| 57 |
40 // Called on a blocking pool thread to create a snapshot file to hold the | 58 // Called on a blocking pool thread to create a snapshot file to hold the |
41 // contents of |device_file_path|. The snapshot file is created in the | 59 // contents of |device_file_path|. The snapshot file is created in the |
42 // "profile_path/kDeviceMediaAsyncFileUtilTempDir" directory. Return the | 60 // "profile_path/kDeviceMediaAsyncFileUtilTempDir" directory. Return the |
43 // snapshot file path or an empty path on failure. | 61 // snapshot file path or an empty path on failure. |
44 base::FilePath CreateSnapshotFileOnBlockingPool( | 62 base::FilePath CreateSnapshotFileOnBlockingPool( |
45 const base::FilePath& device_file_path, | 63 const base::FilePath& device_file_path, |
46 const base::FilePath& profile_path) { | 64 const base::FilePath& profile_path) { |
47 base::FilePath snapshot_file_path; | 65 base::FilePath snapshot_file_path; |
48 base::FilePath media_file_system_dir_path = | 66 base::FilePath media_file_system_dir_path = |
49 profile_path.AppendASCII(kDeviceMediaAsyncFileUtilTempDir); | 67 profile_path.AppendASCII(kDeviceMediaAsyncFileUtilTempDir); |
50 if (!base::CreateDirectory(media_file_system_dir_path) || | 68 if (!base::CreateDirectory(media_file_system_dir_path) || |
51 !base::CreateTemporaryFileInDir(media_file_system_dir_path, | 69 !base::CreateTemporaryFileInDir(media_file_system_dir_path, |
52 &snapshot_file_path)) { | 70 &snapshot_file_path)) { |
53 LOG(WARNING) << "Could not create media snapshot file " | 71 LOG(WARNING) << "Could not create media snapshot file " |
54 << media_file_system_dir_path.value(); | 72 << media_file_system_dir_path.value(); |
55 snapshot_file_path = base::FilePath(); | 73 snapshot_file_path = base::FilePath(); |
56 } | 74 } |
57 return snapshot_file_path; | 75 return snapshot_file_path; |
58 } | 76 } |
59 | 77 |
| 78 // Called after OnDidCreateSnapshotFile finishes media check. |
| 79 // |callback| is invoked to complete the CreateSnapshotFile request. |
| 80 void OnDidCheckMediaForCreateSnapshotFile( |
| 81 const AsyncFileUtil::CreateSnapshotFileCallback& callback, |
| 82 const base::File::Info& file_info, |
| 83 scoped_refptr<webkit_blob::ShareableFileReference> platform_file, |
| 84 base::File::Error error) { |
| 85 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 86 base::FilePath platform_path(platform_file.get()->path()); |
| 87 if (error != base::File::FILE_OK) |
| 88 platform_file = NULL; |
| 89 callback.Run(error, file_info, platform_path, platform_file); |
| 90 } |
| 91 |
| 92 // Called when the snapshot file specified by the |platform_path| is |
| 93 // successfully created. |file_info| contains the device media file details |
| 94 // for which the snapshot file is created. |
| 95 void OnDidCreateSnapshotFile( |
| 96 const AsyncFileUtil::CreateSnapshotFileCallback& callback, |
| 97 base::SequencedTaskRunner* media_task_runner, |
| 98 bool validate_media_files, |
| 99 const base::File::Info& file_info, |
| 100 const base::FilePath& platform_path) { |
| 101 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 102 scoped_refptr<webkit_blob::ShareableFileReference> file = |
| 103 ShareableFileReference::GetOrCreate( |
| 104 platform_path, |
| 105 ShareableFileReference::DELETE_ON_FINAL_RELEASE, |
| 106 media_task_runner); |
| 107 |
| 108 if (validate_media_files) { |
| 109 base::PostTaskAndReplyWithResult( |
| 110 media_task_runner, |
| 111 FROM_HERE, |
| 112 base::Bind(&NativeMediaFileUtil::IsMediaFile, platform_path), |
| 113 base::Bind(&OnDidCheckMediaForCreateSnapshotFile, |
| 114 callback, |
| 115 file_info, |
| 116 file)); |
| 117 } else { |
| 118 OnDidCheckMediaForCreateSnapshotFile(callback, file_info, file, |
| 119 base::File::FILE_OK); |
| 120 } |
| 121 } |
| 122 |
| 123 // Called when CreateSnapshotFile method call fails. |callback| is invoked to |
| 124 // notify the caller about the |error|. |
| 125 void OnCreateSnapshotFileError( |
| 126 const AsyncFileUtil::CreateSnapshotFileCallback& callback, |
| 127 base::File::Error error) { |
| 128 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 129 callback.Run(error, base::File::Info(), base::FilePath(), |
| 130 scoped_refptr<ShareableFileReference>()); |
| 131 } |
| 132 |
| 133 // Called when the snapshot file specified by the |snapshot_file_path| is |
| 134 // created to hold the contents of the url.path(). If the snapshot |
| 135 // file is successfully created, |snapshot_file_path| will be an non-empty |
| 136 // file path. In case of failure, |snapshot_file_path| will be an empty file |
| 137 // path. Forwards the CreateSnapshot request to the delegate to copy the |
| 138 // contents of url.path() to |snapshot_file_path|. |
| 139 void OnSnapshotFileCreatedRunTask( |
| 140 scoped_ptr<FileSystemOperationContext> context, |
| 141 const AsyncFileUtil::CreateSnapshotFileCallback& callback, |
| 142 const FileSystemURL& url, |
| 143 bool validate_media_files, |
| 144 const base::FilePath& snapshot_file_path) { |
| 145 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 146 if (snapshot_file_path.empty()) { |
| 147 OnCreateSnapshotFileError(callback, base::File::FILE_ERROR_FAILED); |
| 148 return; |
| 149 } |
| 150 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url); |
| 151 if (!delegate) { |
| 152 OnCreateSnapshotFileError(callback, base::File::FILE_ERROR_NOT_FOUND); |
| 153 return; |
| 154 } |
| 155 delegate->CreateSnapshotFile( |
| 156 url.path(), // device file path |
| 157 snapshot_file_path, |
| 158 base::Bind(&OnDidCreateSnapshotFile, |
| 159 callback, |
| 160 make_scoped_refptr(context->task_runner()), |
| 161 validate_media_files), |
| 162 base::Bind(&OnCreateSnapshotFileError, callback)); |
| 163 } |
| 164 |
60 } // namespace | 165 } // namespace |
61 | 166 |
62 DeviceMediaAsyncFileUtil::~DeviceMediaAsyncFileUtil() { | 167 DeviceMediaAsyncFileUtil::~DeviceMediaAsyncFileUtil() { |
63 } | 168 } |
64 | 169 |
65 // static | 170 // static |
66 DeviceMediaAsyncFileUtil* DeviceMediaAsyncFileUtil::Create( | 171 scoped_ptr<DeviceMediaAsyncFileUtil> DeviceMediaAsyncFileUtil::Create( |
67 const base::FilePath& profile_path, | 172 const base::FilePath& profile_path, |
68 MediaFileValidationType validation_type) { | 173 MediaFileValidationType validation_type) { |
69 DCHECK(!profile_path.empty()); | 174 DCHECK(!profile_path.empty()); |
70 return new DeviceMediaAsyncFileUtil(profile_path, validation_type); | 175 return make_scoped_ptr( |
| 176 new DeviceMediaAsyncFileUtil(profile_path, validation_type)); |
71 } | 177 } |
72 | 178 |
73 bool DeviceMediaAsyncFileUtil::SupportsStreaming( | 179 bool DeviceMediaAsyncFileUtil::SupportsStreaming( |
74 const fileapi::FileSystemURL& url) { | 180 const fileapi::FileSystemURL& url) { |
75 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 181 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
76 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url); | 182 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url); |
77 if (!delegate) | 183 if (!delegate) |
78 return false; | 184 return false; |
79 return delegate->IsStreaming(); | 185 return delegate->IsStreaming(); |
80 } | 186 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url); | 235 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url); |
130 if (!delegate) { | 236 if (!delegate) { |
131 OnGetFileInfoError(callback, base::File::FILE_ERROR_NOT_FOUND); | 237 OnGetFileInfoError(callback, base::File::FILE_ERROR_NOT_FOUND); |
132 return; | 238 return; |
133 } | 239 } |
134 delegate->GetFileInfo( | 240 delegate->GetFileInfo( |
135 url.path(), | 241 url.path(), |
136 base::Bind(&DeviceMediaAsyncFileUtil::OnDidGetFileInfo, | 242 base::Bind(&DeviceMediaAsyncFileUtil::OnDidGetFileInfo, |
137 weak_ptr_factory_.GetWeakPtr(), | 243 weak_ptr_factory_.GetWeakPtr(), |
138 callback), | 244 callback), |
139 base::Bind(&DeviceMediaAsyncFileUtil::OnGetFileInfoError, | 245 base::Bind(&OnGetFileInfoError, callback)); |
140 weak_ptr_factory_.GetWeakPtr(), | |
141 callback)); | |
142 } | 246 } |
143 | 247 |
144 void DeviceMediaAsyncFileUtil::ReadDirectory( | 248 void DeviceMediaAsyncFileUtil::ReadDirectory( |
145 scoped_ptr<FileSystemOperationContext> context, | 249 scoped_ptr<FileSystemOperationContext> context, |
146 const FileSystemURL& url, | 250 const FileSystemURL& url, |
147 const ReadDirectoryCallback& callback) { | 251 const ReadDirectoryCallback& callback) { |
148 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 252 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
149 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url); | 253 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url); |
150 if (!delegate) { | 254 if (!delegate) { |
151 OnReadDirectoryError(callback, base::File::FILE_ERROR_NOT_FOUND); | 255 OnReadDirectoryError(callback, base::File::FILE_ERROR_NOT_FOUND); |
152 return; | 256 return; |
153 } | 257 } |
154 delegate->ReadDirectory( | 258 delegate->ReadDirectory( |
155 url.path(), | 259 url.path(), |
156 base::Bind(&DeviceMediaAsyncFileUtil::OnDidReadDirectory, | 260 base::Bind(&DeviceMediaAsyncFileUtil::OnDidReadDirectory, |
157 weak_ptr_factory_.GetWeakPtr(), | 261 weak_ptr_factory_.GetWeakPtr(), |
158 callback), | 262 callback), |
159 base::Bind(&DeviceMediaAsyncFileUtil::OnReadDirectoryError, | 263 base::Bind(&OnReadDirectoryError, callback)); |
160 weak_ptr_factory_.GetWeakPtr(), | |
161 callback)); | |
162 } | 264 } |
163 | 265 |
164 void DeviceMediaAsyncFileUtil::Touch( | 266 void DeviceMediaAsyncFileUtil::Touch( |
165 scoped_ptr<FileSystemOperationContext> context, | 267 scoped_ptr<FileSystemOperationContext> context, |
166 const FileSystemURL& url, | 268 const FileSystemURL& url, |
167 const base::Time& last_access_time, | 269 const base::Time& last_access_time, |
168 const base::Time& last_modified_time, | 270 const base::Time& last_modified_time, |
169 const StatusCallback& callback) { | 271 const StatusCallback& callback) { |
170 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 272 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
171 NOTIMPLEMENTED(); | 273 NOTIMPLEMENTED(); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 scoped_ptr<FileSystemOperationContext> context, | 347 scoped_ptr<FileSystemOperationContext> context, |
246 const FileSystemURL& url, | 348 const FileSystemURL& url, |
247 const CreateSnapshotFileCallback& callback) { | 349 const CreateSnapshotFileCallback& callback) { |
248 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 350 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
249 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url); | 351 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url); |
250 if (!delegate) { | 352 if (!delegate) { |
251 OnCreateSnapshotFileError(callback, base::File::FILE_ERROR_NOT_FOUND); | 353 OnCreateSnapshotFileError(callback, base::File::FILE_ERROR_NOT_FOUND); |
252 return; | 354 return; |
253 } | 355 } |
254 | 356 |
255 // Grab the SequencedTaskRunner now because base::Passed(&context) will | |
256 // turn |context| empty before |task_runner| gets accessed. | |
257 scoped_refptr<base::SequencedTaskRunner> task_runner(context->task_runner()); | 357 scoped_refptr<base::SequencedTaskRunner> task_runner(context->task_runner()); |
258 base::PostTaskAndReplyWithResult( | 358 base::PostTaskAndReplyWithResult( |
259 task_runner, | 359 task_runner, |
260 FROM_HERE, | 360 FROM_HERE, |
261 base::Bind(&CreateSnapshotFileOnBlockingPool, | 361 base::Bind(&CreateSnapshotFileOnBlockingPool, url.path(), profile_path_), |
262 url.path(), | 362 base::Bind(&OnSnapshotFileCreatedRunTask, |
263 profile_path_), | |
264 base::Bind(&DeviceMediaAsyncFileUtil::OnSnapshotFileCreatedRunTask, | |
265 weak_ptr_factory_.GetWeakPtr(), | |
266 base::Passed(&context), | 363 base::Passed(&context), |
267 callback, | 364 callback, |
268 url)); | 365 url, |
| 366 validate_media_files())); |
269 } | 367 } |
270 | 368 |
271 scoped_ptr<webkit_blob::FileStreamReader> | 369 scoped_ptr<webkit_blob::FileStreamReader> |
272 DeviceMediaAsyncFileUtil::GetFileStreamReader( | 370 DeviceMediaAsyncFileUtil::GetFileStreamReader( |
273 const FileSystemURL& url, | 371 const FileSystemURL& url, |
274 int64 offset, | 372 int64 offset, |
275 const base::Time& expected_modification_time, | 373 const base::Time& expected_modification_time, |
276 fileapi::FileSystemContext* context) { | 374 fileapi::FileSystemContext* context) { |
277 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url); | 375 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url); |
278 if (!delegate) | 376 if (!delegate) |
279 return scoped_ptr<webkit_blob::FileStreamReader>(); | 377 return scoped_ptr<webkit_blob::FileStreamReader>(); |
280 | 378 |
281 DCHECK(delegate->IsStreaming()); | 379 DCHECK(delegate->IsStreaming()); |
282 return scoped_ptr<webkit_blob::FileStreamReader>( | 380 return scoped_ptr<webkit_blob::FileStreamReader>( |
283 new ReadaheadFileStreamReader(new MTPFileStreamReader( | 381 new ReadaheadFileStreamReader( |
284 context, url, offset, expected_modification_time, | 382 new MTPFileStreamReader(context, |
285 validation_type_ == APPLY_MEDIA_FILE_VALIDATION))); | 383 url, |
| 384 offset, |
| 385 expected_modification_time, |
| 386 validate_media_files()))); |
286 } | 387 } |
287 | 388 |
288 DeviceMediaAsyncFileUtil::DeviceMediaAsyncFileUtil( | 389 DeviceMediaAsyncFileUtil::DeviceMediaAsyncFileUtil( |
289 const base::FilePath& profile_path, | 390 const base::FilePath& profile_path, |
290 MediaFileValidationType validation_type) | 391 MediaFileValidationType validation_type) |
291 : profile_path_(profile_path), | 392 : profile_path_(profile_path), |
292 validation_type_(validation_type), | 393 validation_type_(validation_type), |
293 weak_ptr_factory_(this) { | 394 weak_ptr_factory_(this) { |
294 } | 395 } |
295 | 396 |
296 void DeviceMediaAsyncFileUtil::OnDidGetFileInfo( | 397 void DeviceMediaAsyncFileUtil::OnDidGetFileInfo( |
297 const AsyncFileUtil::GetFileInfoCallback& callback, | 398 const GetFileInfoCallback& callback, |
298 const base::File::Info& file_info) { | 399 const base::File::Info& file_info) { |
| 400 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
299 callback.Run(base::File::FILE_OK, file_info); | 401 callback.Run(base::File::FILE_OK, file_info); |
300 } | 402 } |
301 | 403 |
302 void DeviceMediaAsyncFileUtil::OnGetFileInfoError( | |
303 const AsyncFileUtil::GetFileInfoCallback& callback, | |
304 base::File::Error error) { | |
305 callback.Run(error, base::File::Info()); | |
306 } | |
307 | |
308 void DeviceMediaAsyncFileUtil::OnDidReadDirectory( | 404 void DeviceMediaAsyncFileUtil::OnDidReadDirectory( |
309 const AsyncFileUtil::ReadDirectoryCallback& callback, | 405 const ReadDirectoryCallback& callback, |
310 const AsyncFileUtil::EntryList& file_list, | 406 const EntryList& file_list, |
311 bool has_more) { | 407 bool has_more) { |
| 408 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
312 callback.Run(base::File::FILE_OK, file_list, has_more); | 409 callback.Run(base::File::FILE_OK, file_list, has_more); |
313 } | 410 } |
314 | 411 |
315 void DeviceMediaAsyncFileUtil::OnReadDirectoryError( | 412 bool DeviceMediaAsyncFileUtil::validate_media_files() const { |
316 const AsyncFileUtil::ReadDirectoryCallback& callback, | 413 return validation_type_ == APPLY_MEDIA_FILE_VALIDATION; |
317 base::File::Error error) { | |
318 callback.Run(error, AsyncFileUtil::EntryList(), false /*no more*/); | |
319 } | 414 } |
320 | |
321 void DeviceMediaAsyncFileUtil::OnDidCreateSnapshotFile( | |
322 const AsyncFileUtil::CreateSnapshotFileCallback& callback, | |
323 base::SequencedTaskRunner* media_task_runner, | |
324 const base::File::Info& file_info, | |
325 const base::FilePath& platform_path) { | |
326 scoped_refptr<webkit_blob::ShareableFileReference> file = | |
327 ShareableFileReference::GetOrCreate( | |
328 platform_path, | |
329 ShareableFileReference::DELETE_ON_FINAL_RELEASE, | |
330 media_task_runner); | |
331 | |
332 if (validation_type_ == APPLY_MEDIA_FILE_VALIDATION) { | |
333 base::PostTaskAndReplyWithResult( | |
334 media_task_runner, | |
335 FROM_HERE, | |
336 base::Bind(&NativeMediaFileUtil::IsMediaFile, platform_path), | |
337 base::Bind(&DeviceMediaAsyncFileUtil::OnDidCheckMedia, | |
338 weak_ptr_factory_.GetWeakPtr(), | |
339 callback, | |
340 file_info, | |
341 file)); | |
342 } else { | |
343 OnDidCheckMedia(callback, file_info, file, base::File::FILE_OK); | |
344 } | |
345 } | |
346 | |
347 void DeviceMediaAsyncFileUtil::OnDidCheckMedia( | |
348 const AsyncFileUtil::CreateSnapshotFileCallback& callback, | |
349 const base::File::Info& file_info, | |
350 scoped_refptr<webkit_blob::ShareableFileReference> platform_file, | |
351 base::File::Error error) { | |
352 base::FilePath platform_path(platform_file.get()->path()); | |
353 if (error != base::File::FILE_OK) | |
354 platform_file = NULL; | |
355 callback.Run(error, file_info, platform_path, platform_file); | |
356 } | |
357 | |
358 void DeviceMediaAsyncFileUtil::OnCreateSnapshotFileError( | |
359 const AsyncFileUtil::CreateSnapshotFileCallback& callback, | |
360 base::File::Error error) { | |
361 callback.Run(error, base::File::Info(), base::FilePath(), | |
362 scoped_refptr<ShareableFileReference>()); | |
363 } | |
364 | |
365 void DeviceMediaAsyncFileUtil::OnSnapshotFileCreatedRunTask( | |
366 scoped_ptr<FileSystemOperationContext> context, | |
367 const AsyncFileUtil::CreateSnapshotFileCallback& callback, | |
368 const FileSystemURL& url, | |
369 const base::FilePath& snapshot_file_path) { | |
370 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | |
371 if (snapshot_file_path.empty()) { | |
372 OnCreateSnapshotFileError(callback, base::File::FILE_ERROR_FAILED); | |
373 return; | |
374 } | |
375 MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url); | |
376 if (!delegate) { | |
377 OnCreateSnapshotFileError(callback, base::File::FILE_ERROR_NOT_FOUND); | |
378 return; | |
379 } | |
380 delegate->CreateSnapshotFile( | |
381 url.path(), // device file path | |
382 snapshot_file_path, | |
383 base::Bind(&DeviceMediaAsyncFileUtil::OnDidCreateSnapshotFile, | |
384 weak_ptr_factory_.GetWeakPtr(), | |
385 callback, | |
386 make_scoped_refptr(context->task_runner())), | |
387 base::Bind(&DeviceMediaAsyncFileUtil::OnCreateSnapshotFileError, | |
388 weak_ptr_factory_.GetWeakPtr(), | |
389 callback)); | |
390 } | |
OLD | NEW |