Commit 17a2e1d1 authored by kinaba@chromium.org's avatar kinaba@chromium.org

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
parent 945604a5
...@@ -13,7 +13,8 @@ namespace chromeos { ...@@ -13,7 +13,8 @@ namespace chromeos {
MTPFileSystemBackendDelegate::MTPFileSystemBackendDelegate( MTPFileSystemBackendDelegate::MTPFileSystemBackendDelegate(
const base::FilePath& storage_partition_path) const base::FilePath& storage_partition_path)
: device_media_async_file_util_( : device_media_async_file_util_(
DeviceMediaAsyncFileUtil::Create(storage_partition_path)) { DeviceMediaAsyncFileUtil::Create(storage_partition_path,
NO_MEDIA_FILE_VALIDATION)) {
} }
MTPFileSystemBackendDelegate::~MTPFileSystemBackendDelegate() { MTPFileSystemBackendDelegate::~MTPFileSystemBackendDelegate() {
...@@ -34,10 +35,6 @@ MTPFileSystemBackendDelegate::CreateFileStreamReader( ...@@ -34,10 +35,6 @@ MTPFileSystemBackendDelegate::CreateFileStreamReader(
fileapi::FileSystemContext* context) { fileapi::FileSystemContext* context) {
DCHECK_EQ(fileapi::kFileSystemTypeDeviceMediaAsFileStorage, url.type()); 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( return device_media_async_file_util_->GetFileStreamReader(
url, offset, expected_modification_time, context); url, offset, expected_modification_time, context);
} }
......
...@@ -64,9 +64,10 @@ DeviceMediaAsyncFileUtil::~DeviceMediaAsyncFileUtil() { ...@@ -64,9 +64,10 @@ DeviceMediaAsyncFileUtil::~DeviceMediaAsyncFileUtil() {
// static // static
DeviceMediaAsyncFileUtil* DeviceMediaAsyncFileUtil::Create( DeviceMediaAsyncFileUtil* DeviceMediaAsyncFileUtil::Create(
const base::FilePath& profile_path) { const base::FilePath& profile_path,
MediaFileValidationType validation_type) {
DCHECK(!profile_path.empty()); DCHECK(!profile_path.empty());
return new DeviceMediaAsyncFileUtil(profile_path); return new DeviceMediaAsyncFileUtil(profile_path, validation_type);
} }
bool DeviceMediaAsyncFileUtil::SupportsStreaming( bool DeviceMediaAsyncFileUtil::SupportsStreaming(
...@@ -283,12 +284,15 @@ DeviceMediaAsyncFileUtil::GetFileStreamReader( ...@@ -283,12 +284,15 @@ DeviceMediaAsyncFileUtil::GetFileStreamReader(
DCHECK(delegate->IsStreaming()); DCHECK(delegate->IsStreaming());
return scoped_ptr<webkit_blob::FileStreamReader>( return scoped_ptr<webkit_blob::FileStreamReader>(
new ReadaheadFileStreamReader(new MTPFileStreamReader( new ReadaheadFileStreamReader(new MTPFileStreamReader(
context, url, offset, expected_modification_time))); context, url, offset, expected_modification_time,
validation_type_ == APPLY_MEDIA_FILE_VALIDATION)));
} }
DeviceMediaAsyncFileUtil::DeviceMediaAsyncFileUtil( DeviceMediaAsyncFileUtil::DeviceMediaAsyncFileUtil(
const base::FilePath& profile_path) const base::FilePath& profile_path,
MediaFileValidationType validation_type)
: profile_path_(profile_path), : profile_path_(profile_path),
validation_type_(validation_type),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
} }
...@@ -322,18 +326,25 @@ void DeviceMediaAsyncFileUtil::OnDidCreateSnapshotFile( ...@@ -322,18 +326,25 @@ void DeviceMediaAsyncFileUtil::OnDidCreateSnapshotFile(
base::SequencedTaskRunner* media_task_runner, base::SequencedTaskRunner* media_task_runner,
const base::File::Info& file_info, const base::File::Info& file_info,
const base::FilePath& platform_path) { const base::FilePath& platform_path) {
base::PostTaskAndReplyWithResult( scoped_refptr<webkit_blob::ShareableFileReference> file =
media_task_runner, ShareableFileReference::GetOrCreate(
FROM_HERE, platform_path,
base::Bind(&NativeMediaFileUtil::IsMediaFile, platform_path), ShareableFileReference::DELETE_ON_FINAL_RELEASE,
base::Bind(&DeviceMediaAsyncFileUtil::OnDidCheckMedia, media_task_runner);
weak_ptr_factory_.GetWeakPtr(),
callback, if (validation_type_ == APPLY_MEDIA_FILE_VALIDATION) {
file_info, base::PostTaskAndReplyWithResult(
ShareableFileReference::GetOrCreate( media_task_runner,
platform_path, FROM_HERE,
ShareableFileReference::DELETE_ON_FINAL_RELEASE, base::Bind(&NativeMediaFileUtil::IsMediaFile, platform_path),
media_task_runner))); 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( void DeviceMediaAsyncFileUtil::OnDidCheckMedia(
......
...@@ -30,6 +30,11 @@ namespace webkit_blob { ...@@ -30,6 +30,11 @@ namespace webkit_blob {
class FileStreamReader; class FileStreamReader;
} }
enum MediaFileValidationType {
NO_MEDIA_FILE_VALIDATION,
APPLY_MEDIA_FILE_VALIDATION,
};
class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil { class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil {
public: public:
virtual ~DeviceMediaAsyncFileUtil(); virtual ~DeviceMediaAsyncFileUtil();
...@@ -37,7 +42,9 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil { ...@@ -37,7 +42,9 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil {
// Returns an instance of DeviceMediaAsyncFileUtil. Returns NULL if // Returns an instance of DeviceMediaAsyncFileUtil. Returns NULL if
// asynchronous operation is not supported. Callers own the returned // asynchronous operation is not supported. Callers own the returned
// object. // 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); bool SupportsStreaming(const fileapi::FileSystemURL& url);
...@@ -124,7 +131,8 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil { ...@@ -124,7 +131,8 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil {
private: private:
// Use Create() to get an instance of DeviceMediaAsyncFileUtil. // 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 // Called when GetFileInfo method call succeeds. |file_info| contains the
// file details of the requested url. |callback| is invoked to complete the // file details of the requested url. |callback| is invoked to complete the
...@@ -201,6 +209,8 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil { ...@@ -201,6 +209,8 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil {
// Profile path. // Profile path.
const base::FilePath profile_path_; const base::FilePath profile_path_;
const MediaFileValidationType validation_type_;
// For callbacks that may run after destruction. // For callbacks that may run after destruction.
base::WeakPtrFactory<DeviceMediaAsyncFileUtil> weak_ptr_factory_; base::WeakPtrFactory<DeviceMediaAsyncFileUtil> weak_ptr_factory_;
......
...@@ -127,7 +127,8 @@ MediaFileSystemBackend::MediaFileSystemBackend( ...@@ -127,7 +127,8 @@ MediaFileSystemBackend::MediaFileSystemBackend(
native_media_file_util_( native_media_file_util_(
new NativeMediaFileUtil(media_path_filter_.get())), new NativeMediaFileUtil(media_path_filter_.get())),
device_media_async_file_util_( device_media_async_file_util_(
DeviceMediaAsyncFileUtil::Create(profile_path_)) DeviceMediaAsyncFileUtil::Create(profile_path_,
APPLY_MEDIA_FILE_VALIDATION))
#if defined(OS_WIN) || defined(OS_MACOSX) #if defined(OS_WIN) || defined(OS_MACOSX)
, ,
picasa_file_util_(new picasa::PicasaFileUtil(media_path_filter_.get())), picasa_file_util_(new picasa::PicasaFileUtil(media_path_filter_.get())),
......
...@@ -67,12 +67,13 @@ MTPFileStreamReader::MTPFileStreamReader( ...@@ -67,12 +67,13 @@ MTPFileStreamReader::MTPFileStreamReader(
fileapi::FileSystemContext* file_system_context, fileapi::FileSystemContext* file_system_context,
const fileapi::FileSystemURL& url, const fileapi::FileSystemURL& url,
int64 initial_offset, 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), : file_system_context_(file_system_context),
url_(url), url_(url),
current_offset_(initial_offset), current_offset_(initial_offset),
expected_modification_time_(expected_modification_time), expected_modification_time_(expected_modification_time),
media_header_validated_(false), media_header_validated_(!do_media_header_validation),
weak_factory_(this) { weak_factory_(this) {
} }
......
...@@ -27,7 +27,8 @@ class MTPFileStreamReader ...@@ -27,7 +27,8 @@ class MTPFileStreamReader
MTPFileStreamReader(fileapi::FileSystemContext* file_system_context, MTPFileStreamReader(fileapi::FileSystemContext* file_system_context,
const fileapi::FileSystemURL& url, const fileapi::FileSystemURL& url,
int64 initial_offset, int64 initial_offset,
const base::Time& expected_modification_time); const base::Time& expected_modification_time,
bool do_media_header_validation);
virtual ~MTPFileStreamReader(); virtual ~MTPFileStreamReader();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment