Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5524)

Unified Diff: chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc

Issue 298843002: Media Galleries: Refactor DeviceMediaAsyncFileUtil. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc
===================================================================
--- chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc (revision 271530)
+++ chrome/browser/media_galleries/fileapi/device_media_async_file_util.cc (working copy)
@@ -22,6 +22,7 @@
#include "webkit/browser/fileapi/native_file_util.h"
#include "webkit/common/blob/shareable_file_reference.h"
+using fileapi::AsyncFileUtil;
using fileapi::FileSystemOperationContext;
using fileapi::FileSystemURL;
using webkit_blob::ShareableFileReference;
@@ -30,13 +31,30 @@
const char kDeviceMediaAsyncFileUtilTempDir[] = "DeviceMediaFileSystem";
-// Called on the IO thread.
MTPDeviceAsyncDelegate* GetMTPDeviceDelegate(const FileSystemURL& url) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
return MTPDeviceMapService::GetInstance()->GetMTPDeviceAsyncDelegate(
url.filesystem_id());
}
+// Called when GetFileInfo method call failed to get the details of file
+// specified by the requested url. |callback| is invoked to notify the
+// caller about the file |error|.
+void OnGetFileInfoError(const AsyncFileUtil::GetFileInfoCallback& callback,
+ base::File::Error error) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+ callback.Run(error, base::File::Info());
+}
+
+// Called when ReadDirectory method call failed to enumerate the directory
+// objects. |callback| is invoked to notify the caller about the |error|
+// that occured while reading the directory objects.
+void OnReadDirectoryError(const AsyncFileUtil::ReadDirectoryCallback& callback,
+ base::File::Error error) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+ callback.Run(error, AsyncFileUtil::EntryList(), false /*no more*/);
+}
+
// 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
@@ -57,26 +75,112 @@
return snapshot_file_path;
}
+// Called after OnDidCreateSnapshotFile finishes media check.
+// |callback| is invoked to complete the CreateSnapshotFile request.
+void OnDidCheckMediaForCreateSnapshotFile(
+ const AsyncFileUtil::CreateSnapshotFileCallback& callback,
+ const base::File::Info& file_info,
+ scoped_refptr<webkit_blob::ShareableFileReference> platform_file,
+ base::File::Error error) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+ base::FilePath platform_path(platform_file.get()->path());
+ if (error != base::File::FILE_OK)
+ platform_file = NULL;
+ callback.Run(error, file_info, platform_path, platform_file);
+}
+
+// Called when the snapshot file specified by the |platform_path| is
+// successfully created. |file_info| contains the device media file details
+// for which the snapshot file is created.
+void OnDidCreateSnapshotFile(
+ const AsyncFileUtil::CreateSnapshotFileCallback& callback,
+ base::SequencedTaskRunner* media_task_runner,
+ bool validate_media_files,
+ const base::File::Info& file_info,
+ const base::FilePath& platform_path) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+ scoped_refptr<webkit_blob::ShareableFileReference> file =
+ ShareableFileReference::GetOrCreate(
+ platform_path,
+ ShareableFileReference::DELETE_ON_FINAL_RELEASE,
+ media_task_runner);
+
+ if (validate_media_files) {
+ base::PostTaskAndReplyWithResult(
+ media_task_runner,
+ FROM_HERE,
+ base::Bind(&NativeMediaFileUtil::IsMediaFile, platform_path),
+ base::Bind(&OnDidCheckMediaForCreateSnapshotFile,
+ callback,
+ file_info,
+ file));
+ } else {
+ OnDidCheckMediaForCreateSnapshotFile(callback, file_info, file,
+ base::File::FILE_OK);
+ }
+}
+
+// Called when CreateSnapshotFile method call fails. |callback| is invoked to
+// notify the caller about the |error|.
+void OnCreateSnapshotFileError(
+ const AsyncFileUtil::CreateSnapshotFileCallback& callback,
+ base::File::Error error) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+ callback.Run(error, base::File::Info(), base::FilePath(),
+ scoped_refptr<ShareableFileReference>());
+}
+
+// Called when the snapshot file specified by the |snapshot_file_path| is
+// created to hold the contents of the url.path(). If the snapshot
+// file is successfully created, |snapshot_file_path| will be an non-empty
+// file path. In case of failure, |snapshot_file_path| will be an empty file
+// path. Forwards the CreateSnapshot request to the delegate to copy the
+// contents of url.path() to |snapshot_file_path|.
+void OnSnapshotFileCreatedRunTask(
+ scoped_ptr<FileSystemOperationContext> context,
+ const AsyncFileUtil::CreateSnapshotFileCallback& callback,
+ const FileSystemURL& url,
+ bool validate_media_files,
+ const base::FilePath& snapshot_file_path) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+ if (snapshot_file_path.empty()) {
+ OnCreateSnapshotFileError(callback, base::File::FILE_ERROR_FAILED);
+ return;
+ }
+ MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url);
+ if (!delegate) {
+ OnCreateSnapshotFileError(callback, base::File::FILE_ERROR_NOT_FOUND);
+ return;
+ }
+ delegate->CreateSnapshotFile(
+ url.path(), // device file path
+ snapshot_file_path,
+ base::Bind(&OnDidCreateSnapshotFile,
+ callback,
+ make_scoped_refptr(context->task_runner()),
+ validate_media_files),
+ base::Bind(&OnCreateSnapshotFileError, callback));
+}
+
} // namespace
DeviceMediaAsyncFileUtil::~DeviceMediaAsyncFileUtil() {
}
// static
-DeviceMediaAsyncFileUtil* DeviceMediaAsyncFileUtil::Create(
+scoped_ptr<DeviceMediaAsyncFileUtil> DeviceMediaAsyncFileUtil::Create(
const base::FilePath& profile_path,
MediaFileValidationType validation_type) {
DCHECK(!profile_path.empty());
- return new DeviceMediaAsyncFileUtil(profile_path, validation_type);
+ return make_scoped_ptr(
+ new DeviceMediaAsyncFileUtil(profile_path, validation_type));
}
bool DeviceMediaAsyncFileUtil::SupportsStreaming(
const fileapi::FileSystemURL& url) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url);
- if (!delegate)
- return false;
- return delegate->IsStreaming();
+ return delegate ? delegate->IsStreaming() : false;
vandebo (ex-Chrome) 2014/05/21 18:46:46 nit: this seems less readable.
Lei Zhang 2014/05/21 19:04:38 *shrug* revert
}
void DeviceMediaAsyncFileUtil::CreateOrOpen(
@@ -136,9 +240,7 @@
base::Bind(&DeviceMediaAsyncFileUtil::OnDidGetFileInfo,
weak_ptr_factory_.GetWeakPtr(),
callback),
- base::Bind(&DeviceMediaAsyncFileUtil::OnGetFileInfoError,
- weak_ptr_factory_.GetWeakPtr(),
- callback));
+ base::Bind(&OnGetFileInfoError, callback));
}
void DeviceMediaAsyncFileUtil::ReadDirectory(
@@ -156,9 +258,7 @@
base::Bind(&DeviceMediaAsyncFileUtil::OnDidReadDirectory,
weak_ptr_factory_.GetWeakPtr(),
callback),
- base::Bind(&DeviceMediaAsyncFileUtil::OnReadDirectoryError,
- weak_ptr_factory_.GetWeakPtr(),
- callback));
+ base::Bind(&OnReadDirectoryError, callback));
}
void DeviceMediaAsyncFileUtil::Touch(
@@ -252,20 +352,16 @@
return;
}
- // Grab the SequencedTaskRunner now because base::Passed(&context) will
- // turn |context| empty before |task_runner| gets accessed.
scoped_refptr<base::SequencedTaskRunner> task_runner(context->task_runner());
base::PostTaskAndReplyWithResult(
task_runner,
FROM_HERE,
- base::Bind(&CreateSnapshotFileOnBlockingPool,
- url.path(),
- profile_path_),
- base::Bind(&DeviceMediaAsyncFileUtil::OnSnapshotFileCreatedRunTask,
- weak_ptr_factory_.GetWeakPtr(),
+ base::Bind(&CreateSnapshotFileOnBlockingPool, url.path(), profile_path_),
+ base::Bind(&OnSnapshotFileCreatedRunTask,
base::Passed(&context),
callback,
- url));
+ url,
+ validate_media_files()));
}
scoped_ptr<webkit_blob::FileStreamReader>
@@ -280,9 +376,12 @@
DCHECK(delegate->IsStreaming());
return scoped_ptr<webkit_blob::FileStreamReader>(
- new ReadaheadFileStreamReader(new MTPFileStreamReader(
- context, url, offset, expected_modification_time,
- validation_type_ == APPLY_MEDIA_FILE_VALIDATION)));
+ new ReadaheadFileStreamReader(
+ new MTPFileStreamReader(context,
+ url,
+ offset,
+ expected_modification_time,
+ validate_media_files())));
}
DeviceMediaAsyncFileUtil::DeviceMediaAsyncFileUtil(
@@ -294,97 +393,20 @@
}
void DeviceMediaAsyncFileUtil::OnDidGetFileInfo(
- const AsyncFileUtil::GetFileInfoCallback& callback,
+ const GetFileInfoCallback& callback,
const base::File::Info& file_info) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
callback.Run(base::File::FILE_OK, file_info);
}
-void DeviceMediaAsyncFileUtil::OnGetFileInfoError(
- const AsyncFileUtil::GetFileInfoCallback& callback,
- base::File::Error error) {
- callback.Run(error, base::File::Info());
-}
-
void DeviceMediaAsyncFileUtil::OnDidReadDirectory(
- const AsyncFileUtil::ReadDirectoryCallback& callback,
- const AsyncFileUtil::EntryList& file_list,
+ const ReadDirectoryCallback& callback,
+ const EntryList& file_list,
bool has_more) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
callback.Run(base::File::FILE_OK, file_list, has_more);
}
-void DeviceMediaAsyncFileUtil::OnReadDirectoryError(
- const AsyncFileUtil::ReadDirectoryCallback& callback,
- base::File::Error error) {
- callback.Run(error, AsyncFileUtil::EntryList(), false /*no more*/);
+bool DeviceMediaAsyncFileUtil::validate_media_files() const {
+ return validation_type_ == APPLY_MEDIA_FILE_VALIDATION;
}
-
-void DeviceMediaAsyncFileUtil::OnDidCreateSnapshotFile(
- const AsyncFileUtil::CreateSnapshotFileCallback& callback,
- base::SequencedTaskRunner* media_task_runner,
- const base::File::Info& file_info,
- const base::FilePath& platform_path) {
- scoped_refptr<webkit_blob::ShareableFileReference> file =
- ShareableFileReference::GetOrCreate(
- platform_path,
- ShareableFileReference::DELETE_ON_FINAL_RELEASE,
- media_task_runner);
-
- if (validation_type_ == APPLY_MEDIA_FILE_VALIDATION) {
- base::PostTaskAndReplyWithResult(
- media_task_runner,
- FROM_HERE,
- base::Bind(&NativeMediaFileUtil::IsMediaFile, platform_path),
- base::Bind(&DeviceMediaAsyncFileUtil::OnDidCheckMedia,
- weak_ptr_factory_.GetWeakPtr(),
- callback,
- file_info,
- file));
- } else {
- OnDidCheckMedia(callback, file_info, file, base::File::FILE_OK);
- }
-}
-
-void DeviceMediaAsyncFileUtil::OnDidCheckMedia(
- const AsyncFileUtil::CreateSnapshotFileCallback& callback,
- const base::File::Info& file_info,
- scoped_refptr<webkit_blob::ShareableFileReference> platform_file,
- base::File::Error error) {
- base::FilePath platform_path(platform_file.get()->path());
- if (error != base::File::FILE_OK)
- platform_file = NULL;
- callback.Run(error, file_info, platform_path, platform_file);
-}
-
-void DeviceMediaAsyncFileUtil::OnCreateSnapshotFileError(
- const AsyncFileUtil::CreateSnapshotFileCallback& callback,
- base::File::Error error) {
- callback.Run(error, base::File::Info(), base::FilePath(),
- scoped_refptr<ShareableFileReference>());
-}
-
-void DeviceMediaAsyncFileUtil::OnSnapshotFileCreatedRunTask(
- scoped_ptr<FileSystemOperationContext> context,
- const AsyncFileUtil::CreateSnapshotFileCallback& callback,
- const FileSystemURL& url,
- const base::FilePath& snapshot_file_path) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
- if (snapshot_file_path.empty()) {
- OnCreateSnapshotFileError(callback, base::File::FILE_ERROR_FAILED);
- return;
- }
- MTPDeviceAsyncDelegate* delegate = GetMTPDeviceDelegate(url);
- if (!delegate) {
- OnCreateSnapshotFileError(callback, base::File::FILE_ERROR_NOT_FOUND);
- return;
- }
- delegate->CreateSnapshotFile(
- url.path(), // device file path
- snapshot_file_path,
- base::Bind(&DeviceMediaAsyncFileUtil::OnDidCreateSnapshotFile,
- weak_ptr_factory_.GetWeakPtr(),
- callback,
- make_scoped_refptr(context->task_runner())),
- base::Bind(&DeviceMediaAsyncFileUtil::OnCreateSnapshotFileError,
- weak_ptr_factory_.GetWeakPtr(),
- callback));
-}

Powered by Google App Engine
This is Rietveld 408576698