diff options
author | kinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-28 12:31:13 +0000 |
---|---|---|
committer | kinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-28 12:31:13 +0000 |
commit | 17a2e1d18d81137265fac273f0218f0d47795625 (patch) | |
tree | 1f5d6560901f271eb6f9a62d89e634f2549b9752 | |
parent | 945604a562be79e66de3d247fe2eaaa06dc4f777 (diff) | |
download | chromium_src-17a2e1d18d81137265fac273f0218f0d47795625.zip chromium_src-17a2e1d18d81137265fac273f0218f0d47795625.tar.gz chromium_src-17a2e1d18d81137265fac273f0218f0d47795625.tar.bz2 |
No media-file validation mode for DeviceMediaAsyncUtil.
CreateSnapshotFile and GetFileStreamReader used to sniff the content
of the files and returned error if it does not look like media data.
This CL adds a mode to disable the check, and use the disabled mode
in MTP mounting in Chrome OS file manager.
BUG=367004
Review URL: https://codereview.chromium.org/251723004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@266524 0039d316-1c4b-4281-b951-d872f2087c98
6 files changed, 48 insertions, 27 deletions
diff --git a/chrome/browser/chromeos/fileapi/mtp_file_system_backend_delegate.cc b/chrome/browser/chromeos/fileapi/mtp_file_system_backend_delegate.cc index 773e13d..27a01a2 100644 --- a/chrome/browser/chromeos/fileapi/mtp_file_system_backend_delegate.cc +++ b/chrome/browser/chromeos/fileapi/mtp_file_system_backend_delegate.cc @@ -13,7 +13,8 @@ namespace chromeos { MTPFileSystemBackendDelegate::MTPFileSystemBackendDelegate( const base::FilePath& storage_partition_path) : device_media_async_file_util_( - DeviceMediaAsyncFileUtil::Create(storage_partition_path)) { + DeviceMediaAsyncFileUtil::Create(storage_partition_path, + NO_MEDIA_FILE_VALIDATION)) { } MTPFileSystemBackendDelegate::~MTPFileSystemBackendDelegate() { @@ -34,10 +35,6 @@ MTPFileSystemBackendDelegate::CreateFileStreamReader( fileapi::FileSystemContext* context) { DCHECK_EQ(fileapi::kFileSystemTypeDeviceMediaAsFileStorage, url.type()); - // TODO(kinaba): Returned MediaFileStreamReader verifies file header and - // stops reading if the stream does not represent a media file. We might - // want to remove the verification here since we want to mount MTP devices - // as normal file storage in Chrome OS file manager. return device_media_async_file_util_->GetFileStreamReader( url, offset, expected_modification_time, context); } 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 9ca5faa..18f3018 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 @@ -64,9 +64,10 @@ DeviceMediaAsyncFileUtil::~DeviceMediaAsyncFileUtil() { // static DeviceMediaAsyncFileUtil* DeviceMediaAsyncFileUtil::Create( - const base::FilePath& profile_path) { + const base::FilePath& profile_path, + MediaFileValidationType validation_type) { DCHECK(!profile_path.empty()); - return new DeviceMediaAsyncFileUtil(profile_path); + return new DeviceMediaAsyncFileUtil(profile_path, validation_type); } bool DeviceMediaAsyncFileUtil::SupportsStreaming( @@ -283,12 +284,15 @@ DeviceMediaAsyncFileUtil::GetFileStreamReader( DCHECK(delegate->IsStreaming()); return scoped_ptr<webkit_blob::FileStreamReader>( new ReadaheadFileStreamReader(new MTPFileStreamReader( - context, url, offset, expected_modification_time))); + context, url, offset, expected_modification_time, + validation_type_ == APPLY_MEDIA_FILE_VALIDATION))); } DeviceMediaAsyncFileUtil::DeviceMediaAsyncFileUtil( - const base::FilePath& profile_path) + const base::FilePath& profile_path, + MediaFileValidationType validation_type) : profile_path_(profile_path), + validation_type_(validation_type), weak_ptr_factory_(this) { } @@ -322,18 +326,25 @@ void DeviceMediaAsyncFileUtil::OnDidCreateSnapshotFile( base::SequencedTaskRunner* media_task_runner, const base::File::Info& file_info, const base::FilePath& platform_path) { - base::PostTaskAndReplyWithResult( - media_task_runner, - FROM_HERE, - base::Bind(&NativeMediaFileUtil::IsMediaFile, platform_path), - base::Bind(&DeviceMediaAsyncFileUtil::OnDidCheckMedia, - weak_ptr_factory_.GetWeakPtr(), - callback, - file_info, - ShareableFileReference::GetOrCreate( - platform_path, - ShareableFileReference::DELETE_ON_FINAL_RELEASE, - media_task_runner))); + 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( diff --git a/chrome/browser/media_galleries/fileapi/device_media_async_file_util.h b/chrome/browser/media_galleries/fileapi/device_media_async_file_util.h index d7afcd1..83f58da 100644 --- a/chrome/browser/media_galleries/fileapi/device_media_async_file_util.h +++ b/chrome/browser/media_galleries/fileapi/device_media_async_file_util.h @@ -30,6 +30,11 @@ namespace webkit_blob { class FileStreamReader; } +enum MediaFileValidationType { + NO_MEDIA_FILE_VALIDATION, + APPLY_MEDIA_FILE_VALIDATION, +}; + class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil { public: virtual ~DeviceMediaAsyncFileUtil(); @@ -37,7 +42,9 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil { // Returns an instance of DeviceMediaAsyncFileUtil. Returns NULL if // asynchronous operation is not supported. Callers own the returned // object. - static DeviceMediaAsyncFileUtil* Create(const base::FilePath& profile_path); + static DeviceMediaAsyncFileUtil* Create( + const base::FilePath& profile_path, + MediaFileValidationType validation_type); bool SupportsStreaming(const fileapi::FileSystemURL& url); @@ -124,7 +131,8 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil { private: // Use Create() to get an instance of DeviceMediaAsyncFileUtil. - explicit DeviceMediaAsyncFileUtil(const base::FilePath& profile_path); + DeviceMediaAsyncFileUtil(const base::FilePath& profile_path, + MediaFileValidationType validation_type); // Called when GetFileInfo method call succeeds. |file_info| contains the // file details of the requested url. |callback| is invoked to complete the @@ -201,6 +209,8 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil { // Profile path. const base::FilePath profile_path_; + const MediaFileValidationType validation_type_; + // For callbacks that may run after destruction. base::WeakPtrFactory<DeviceMediaAsyncFileUtil> weak_ptr_factory_; diff --git a/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc b/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc index 53cecee..929ce85 100644 --- a/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc +++ b/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc @@ -127,7 +127,8 @@ MediaFileSystemBackend::MediaFileSystemBackend( native_media_file_util_( new NativeMediaFileUtil(media_path_filter_.get())), device_media_async_file_util_( - DeviceMediaAsyncFileUtil::Create(profile_path_)) + DeviceMediaAsyncFileUtil::Create(profile_path_, + APPLY_MEDIA_FILE_VALIDATION)) #if defined(OS_WIN) || defined(OS_MACOSX) , picasa_file_util_(new picasa::PicasaFileUtil(media_path_filter_.get())), diff --git a/chrome/browser/media_galleries/fileapi/mtp_file_stream_reader.cc b/chrome/browser/media_galleries/fileapi/mtp_file_stream_reader.cc index 3ec83bc..990f774 100644 --- a/chrome/browser/media_galleries/fileapi/mtp_file_stream_reader.cc +++ b/chrome/browser/media_galleries/fileapi/mtp_file_stream_reader.cc @@ -67,12 +67,13 @@ MTPFileStreamReader::MTPFileStreamReader( fileapi::FileSystemContext* file_system_context, const fileapi::FileSystemURL& url, int64 initial_offset, - const base::Time& expected_modification_time) + const base::Time& expected_modification_time, + bool do_media_header_validation) : file_system_context_(file_system_context), url_(url), current_offset_(initial_offset), expected_modification_time_(expected_modification_time), - media_header_validated_(false), + media_header_validated_(!do_media_header_validation), weak_factory_(this) { } diff --git a/chrome/browser/media_galleries/fileapi/mtp_file_stream_reader.h b/chrome/browser/media_galleries/fileapi/mtp_file_stream_reader.h index 0b3e61e..1b09717 100644 --- a/chrome/browser/media_galleries/fileapi/mtp_file_stream_reader.h +++ b/chrome/browser/media_galleries/fileapi/mtp_file_stream_reader.h @@ -27,7 +27,8 @@ class MTPFileStreamReader MTPFileStreamReader(fileapi::FileSystemContext* file_system_context, const fileapi::FileSystemURL& url, int64 initial_offset, - const base::Time& expected_modification_time); + const base::Time& expected_modification_time, + bool do_media_header_validation); virtual ~MTPFileStreamReader(); |