Commit c6692478 authored by thestig@chromium.org's avatar thestig@chromium.org

Media Galleries: Make DeviceMediaAsyncFileUtil filter directory contents.

BUG=367029

Review URL: https://codereview.chromium.org/293033009

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@272439 0039d316-1c4b-4281-b951-d872f2087c98
parent c2e6ced5
...@@ -46,6 +46,30 @@ void OnGetFileInfoError(const AsyncFileUtil::GetFileInfoCallback& callback, ...@@ -46,6 +46,30 @@ void OnGetFileInfoError(const AsyncFileUtil::GetFileInfoCallback& callback,
callback.Run(error, base::File::Info()); callback.Run(error, base::File::Info());
} }
// Called after OnDidGetFileInfo finishes media check.
// |callback| is invoked to complete the GetFileInfo request.
void OnDidCheckMediaForGetFileInfo(
const AsyncFileUtil::GetFileInfoCallback& callback,
const base::File::Info& file_info,
bool is_valid_file) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
if (!is_valid_file) {
OnGetFileInfoError(callback, base::File::FILE_ERROR_NOT_FOUND);
return;
}
callback.Run(base::File::FILE_OK, file_info);
}
// Called after OnDidReadDirectory finishes media check.
// |callback| is invoked to complete the ReadDirectory request.
void OnDidCheckMediaForReadDirectory(
const AsyncFileUtil::ReadDirectoryCallback& callback,
bool has_more,
const AsyncFileUtil::EntryList& file_list) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
callback.Run(base::File::FILE_OK, file_list, has_more);
}
// Called when ReadDirectory method call failed to enumerate the directory // Called when ReadDirectory method call failed to enumerate the directory
// objects. |callback| is invoked to notify the caller about the |error| // objects. |callback| is invoked to notify the caller about the |error|
// that occured while reading the directory objects. // that occured while reading the directory objects.
...@@ -164,6 +188,55 @@ void OnSnapshotFileCreatedRunTask( ...@@ -164,6 +188,55 @@ void OnSnapshotFileCreatedRunTask(
} // namespace } // namespace
class DeviceMediaAsyncFileUtil::MediaPathFilterWrapper
: public base::RefCountedThreadSafe<MediaPathFilterWrapper> {
public:
MediaPathFilterWrapper();
// Check if entries in |file_list| look like media files.
// Append the ones that look like media files to |results|.
// Should run on a media task runner.
AsyncFileUtil::EntryList FilterMediaEntries(
const AsyncFileUtil::EntryList& file_list);
// Check if |path| looks like a media file.
bool CheckFilePath(const base::FilePath& path);
private:
friend class base::RefCountedThreadSafe<MediaPathFilterWrapper>;
virtual ~MediaPathFilterWrapper();
scoped_ptr<MediaPathFilter> media_path_filter_;
DISALLOW_COPY_AND_ASSIGN(MediaPathFilterWrapper);
};
DeviceMediaAsyncFileUtil::MediaPathFilterWrapper::MediaPathFilterWrapper()
: media_path_filter_(new MediaPathFilter) {
}
DeviceMediaAsyncFileUtil::MediaPathFilterWrapper::~MediaPathFilterWrapper() {
}
AsyncFileUtil::EntryList
DeviceMediaAsyncFileUtil::MediaPathFilterWrapper::FilterMediaEntries(
const AsyncFileUtil::EntryList& file_list) {
AsyncFileUtil::EntryList results;
for (size_t i = 0; i < file_list.size(); ++i) {
const fileapi::DirectoryEntry& entry = file_list[i];
if (entry.is_directory || CheckFilePath(base::FilePath(entry.name))) {
results.push_back(entry);
}
}
return results;
}
bool DeviceMediaAsyncFileUtil::MediaPathFilterWrapper::CheckFilePath(
const base::FilePath& path) {
return media_path_filter_->Match(path);
}
DeviceMediaAsyncFileUtil::~DeviceMediaAsyncFileUtil() { DeviceMediaAsyncFileUtil::~DeviceMediaAsyncFileUtil() {
} }
...@@ -241,6 +314,8 @@ void DeviceMediaAsyncFileUtil::GetFileInfo( ...@@ -241,6 +314,8 @@ void DeviceMediaAsyncFileUtil::GetFileInfo(
url.path(), url.path(),
base::Bind(&DeviceMediaAsyncFileUtil::OnDidGetFileInfo, base::Bind(&DeviceMediaAsyncFileUtil::OnDidGetFileInfo,
weak_ptr_factory_.GetWeakPtr(), weak_ptr_factory_.GetWeakPtr(),
base::Passed(&context),
url.path(),
callback), callback),
base::Bind(&OnGetFileInfoError, callback)); base::Bind(&OnGetFileInfoError, callback));
} }
...@@ -259,6 +334,7 @@ void DeviceMediaAsyncFileUtil::ReadDirectory( ...@@ -259,6 +334,7 @@ void DeviceMediaAsyncFileUtil::ReadDirectory(
url.path(), url.path(),
base::Bind(&DeviceMediaAsyncFileUtil::OnDidReadDirectory, base::Bind(&DeviceMediaAsyncFileUtil::OnDidReadDirectory,
weak_ptr_factory_.GetWeakPtr(), weak_ptr_factory_.GetWeakPtr(),
base::Passed(&context),
callback), callback),
base::Bind(&OnReadDirectoryError, callback)); base::Bind(&OnReadDirectoryError, callback));
} }
...@@ -390,25 +466,52 @@ DeviceMediaAsyncFileUtil::DeviceMediaAsyncFileUtil( ...@@ -390,25 +466,52 @@ DeviceMediaAsyncFileUtil::DeviceMediaAsyncFileUtil(
const base::FilePath& profile_path, const base::FilePath& profile_path,
MediaFileValidationType validation_type) MediaFileValidationType validation_type)
: profile_path_(profile_path), : profile_path_(profile_path),
validation_type_(validation_type),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
if (validation_type == APPLY_MEDIA_FILE_VALIDATION) {
media_path_filter_wrapper_ = new MediaPathFilterWrapper;
}
} }
void DeviceMediaAsyncFileUtil::OnDidGetFileInfo( void DeviceMediaAsyncFileUtil::OnDidGetFileInfo(
const GetFileInfoCallback& callback, scoped_ptr<FileSystemOperationContext> context,
const base::FilePath& path,
const AsyncFileUtil::GetFileInfoCallback& callback,
const base::File::Info& file_info) { const base::File::Info& file_info) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO); DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
callback.Run(base::File::FILE_OK, file_info); if (file_info.is_directory || !validate_media_files()) {
OnDidCheckMediaForGetFileInfo(callback, file_info, true /* valid */);
return;
}
base::PostTaskAndReplyWithResult(
context->task_runner(),
FROM_HERE,
base::Bind(&MediaPathFilterWrapper::CheckFilePath,
media_path_filter_wrapper_,
path),
base::Bind(&OnDidCheckMediaForGetFileInfo, callback, file_info));
} }
void DeviceMediaAsyncFileUtil::OnDidReadDirectory( void DeviceMediaAsyncFileUtil::OnDidReadDirectory(
const ReadDirectoryCallback& callback, scoped_ptr<fileapi::FileSystemOperationContext> context,
const EntryList& file_list, const AsyncFileUtil::ReadDirectoryCallback& callback,
const AsyncFileUtil::EntryList& file_list,
bool has_more) { bool has_more) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO); DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
callback.Run(base::File::FILE_OK, file_list, has_more); if (!validate_media_files()) {
OnDidCheckMediaForReadDirectory(callback, has_more, file_list);
return;
}
base::PostTaskAndReplyWithResult(
context->task_runner(),
FROM_HERE,
base::Bind(&MediaPathFilterWrapper::FilterMediaEntries,
media_path_filter_wrapper_,
file_list),
base::Bind(&OnDidCheckMediaForReadDirectory, callback, has_more));
} }
bool DeviceMediaAsyncFileUtil::validate_media_files() const { bool DeviceMediaAsyncFileUtil::validate_media_files() const {
return validation_type_ == APPLY_MEDIA_FILE_VALIDATION; return media_path_filter_wrapper_.get() != NULL;
} }
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/files/file.h" #include "base/files/file.h"
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "webkit/browser/fileapi/async_file_util.h" #include "webkit/browser/fileapi/async_file_util.h"
...@@ -119,6 +120,8 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil { ...@@ -119,6 +120,8 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil {
fileapi::FileSystemContext* context); fileapi::FileSystemContext* context);
private: private:
class MediaPathFilterWrapper;
// Use Create() to get an instance of DeviceMediaAsyncFileUtil. // Use Create() to get an instance of DeviceMediaAsyncFileUtil.
DeviceMediaAsyncFileUtil(const base::FilePath& profile_path, DeviceMediaAsyncFileUtil(const base::FilePath& profile_path,
MediaFileValidationType validation_type); MediaFileValidationType validation_type);
...@@ -126,7 +129,10 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil { ...@@ -126,7 +129,10 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil {
// 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
// GetFileInfo request. // GetFileInfo request.
void OnDidGetFileInfo(const GetFileInfoCallback& callback, void OnDidGetFileInfo(
scoped_ptr<fileapi::FileSystemOperationContext> context,
const base::FilePath& path,
const GetFileInfoCallback& callback,
const base::File::Info& file_info); const base::File::Info& file_info);
// Called when ReadDirectory method call succeeds. |callback| is invoked to // Called when ReadDirectory method call succeeds. |callback| is invoked to
...@@ -141,6 +147,7 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil { ...@@ -141,6 +147,7 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil {
// in any two calls are disjoint), and |has_more| will be true, except for // in any two calls are disjoint), and |has_more| will be true, except for
// the last chunk. // the last chunk.
void OnDidReadDirectory( void OnDidReadDirectory(
scoped_ptr<fileapi::FileSystemOperationContext> context,
const ReadDirectoryCallback& callback, const ReadDirectoryCallback& callback,
const EntryList& file_list, const EntryList& file_list,
bool has_more); bool has_more);
...@@ -150,7 +157,7 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil { ...@@ -150,7 +157,7 @@ class DeviceMediaAsyncFileUtil : public fileapi::AsyncFileUtil {
// Profile path. // Profile path.
const base::FilePath profile_path_; const base::FilePath profile_path_;
const MediaFileValidationType validation_type_; scoped_refptr<MediaPathFilterWrapper> media_path_filter_wrapper_;
// 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_;
......
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