Chromium Code Reviews| Index: chrome/browser/media_galleries/fileapi/native_media_file_util.cc |
| diff --git a/chrome/browser/media_galleries/fileapi/native_media_file_util.cc b/chrome/browser/media_galleries/fileapi/native_media_file_util.cc |
| index 0239a6c6d25d7bf76126989c4a4b908e1e89da8b..56ede341a2f48e1872e558c3822d8ea295e9f351 100644 |
| --- a/chrome/browser/media_galleries/fileapi/native_media_file_util.cc |
| +++ b/chrome/browser/media_galleries/fileapi/native_media_file_util.cc |
| @@ -4,24 +4,20 @@ |
| #include "chrome/browser/media_galleries/fileapi/native_media_file_util.h" |
| +#include "base/bind.h" |
| #include "base/file_util.h" |
| #include "base/string_util.h" |
| -#include "chrome/browser/media_galleries/fileapi/filtering_file_enumerator.h" |
| +#include "base/task_runner_util.h" |
| #include "chrome/browser/media_galleries/fileapi/media_file_system_mount_point_provider.h" |
| #include "chrome/browser/media_galleries/fileapi/media_path_filter.h" |
| +#include "content/public/browser/browser_thread.h" |
| #include "googleurl/src/gurl.h" |
| #include "net/base/mime_sniffer.h" |
| #include "webkit/browser/fileapi/file_system_context.h" |
| #include "webkit/browser/fileapi/file_system_operation_context.h" |
| #include "webkit/browser/fileapi/file_system_task_runners.h" |
| #include "webkit/browser/fileapi/native_file_util.h" |
| - |
| -using base::PlatformFile; |
| -using base::PlatformFileError; |
| -using base::PlatformFileInfo; |
| -using fileapi::FileSystemOperationContext; |
| -using fileapi::FileSystemURL; |
| -using fileapi::NativeFileUtil; |
| +#include "webkit/common/blob/shareable_file_reference.h" |
| namespace chrome { |
| @@ -38,108 +34,324 @@ struct ScopedPlatformFileClose { |
| typedef scoped_ptr<base::PlatformFile, ScopedPlatformFileClose> |
| ScopedPlatformFile; |
| +// Used to skip the hidden folders and files. Returns true if the file specified |
| +// by |path| should be skipped. |
| +bool ShouldSkip(const base::FilePath& path) { |
| + const base::FilePath::StringType base_name = path.BaseName().value(); |
| + if (base_name.empty()) |
| + return false; |
| + |
| + // Dot files (aka hidden files) |
| + if (base_name[0] == '.') |
| + return true; |
| + |
| + // Mac OS X file. |
| + if (base_name == FILE_PATH_LITERAL("__MACOSX")) |
| + return true; |
| + |
| +#if defined(OS_WIN) |
| + DWORD file_attributes = ::GetFileAttributes(path.value().c_str()); |
| + if ((file_attributes != INVALID_FILE_ATTRIBUTES) && |
| + ((file_attributes & FILE_ATTRIBUTE_HIDDEN) != 0)) |
| + return true; |
| +#else |
| + // Windows always creates a recycle bin folder in the attached device to store |
| + // all the deleted contents. On non-windows operating systems, there is no way |
| + // to get the hidden attribute of windows recycle bin folders that are present |
| + // on the attached device. Therefore, compare the file path name to the |
| + // recycle bin name and exclude those folders. For more details, please refer |
| + // to http://support.microsoft.com/kb/171694. |
| + const char win_98_recycle_bin_name[] = "RECYCLED"; |
| + const char win_xp_recycle_bin_name[] = "RECYCLER"; |
| + const char win_vista_recycle_bin_name[] = "$Recycle.bin"; |
| + if ((base::strncasecmp(base_name.c_str(), |
| + win_98_recycle_bin_name, |
| + strlen(win_98_recycle_bin_name)) == 0) || |
| + (base::strncasecmp(base_name.c_str(), |
| + win_xp_recycle_bin_name, |
| + strlen(win_xp_recycle_bin_name)) == 0) || |
| + (base::strncasecmp(base_name.c_str(), |
| + win_vista_recycle_bin_name, |
| + strlen(win_vista_recycle_bin_name)) == 0)) |
| + return true; |
| +#endif |
| + return false; |
| +} |
| + |
| // Returns true if the current thread is capable of doing IO. |
| bool IsOnTaskRunnerThread(fileapi::FileSystemOperationContext* context) { |
| return context->file_system_context()->task_runners()-> |
| media_task_runner()->RunsTasksOnCurrentThread(); |
| } |
| -MediaPathFilter* GetMediaPathFilter(FileSystemOperationContext* context) { |
| +MediaPathFilter* GetMediaPathFilter( |
| + fileapi::FileSystemOperationContext* context) { |
| return context->GetUserValue<MediaPathFilter*>( |
| MediaFileSystemMountPointProvider::kMediaPathFilterKey); |
| } |
| } // namespace |
| -NativeMediaFileUtil::NativeMediaFileUtil() { |
| +NativeMediaFileUtil::NativeMediaFileUtil() : weak_factory_(this) { |
| } |
| -PlatformFileError NativeMediaFileUtil::CreateOrOpen( |
| - FileSystemOperationContext* context, |
| - const FileSystemURL& url, |
| +bool NativeMediaFileUtil::CreateOrOpen( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| int file_flags, |
| - PlatformFile* file_handle, |
| - bool* created) { |
| + const CreateOrOpenCallback& callback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| // Only called by NaCl, which should not have access to media file systems. |
| - return base::PLATFORM_FILE_ERROR_SECURITY; |
| + base::PlatformFile invalid_file(base::kInvalidPlatformFileValue); |
| + callback.Run(base::PLATFORM_FILE_ERROR_SECURITY, |
| + base::PassPlatformFile(&invalid_file), |
| + false); |
| + return true; |
| } |
| -PlatformFileError NativeMediaFileUtil::EnsureFileExists( |
| - FileSystemOperationContext* context, |
| - const FileSystemURL& url, bool* created) { |
| - base::FilePath file_path; |
| - PlatformFileError error = GetFilteredLocalFilePath(context, url, &file_path); |
| - if (error != base::PLATFORM_FILE_OK) |
| - return error; |
| - return NativeFileUtil::EnsureFileExists(file_path, created); |
| +bool NativeMediaFileUtil::EnsureFileExists( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + const EnsureFileExistsCallback& callback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| + callback.Run(base::PLATFORM_FILE_ERROR_SECURITY, false); |
|
Lei Zhang
2013/06/03 10:05:46
You need to check if the callback is null.
if (!c
vandebo (ex-Chrome)
2013/06/03 19:15:26
Done.
|
| + return true; |
| } |
| -scoped_ptr<fileapi::FileSystemFileUtil::AbstractFileEnumerator> |
| -NativeMediaFileUtil::CreateFileEnumerator( |
| - FileSystemOperationContext* context, |
| - const FileSystemURL& root_url) { |
| - DCHECK(context); |
| - return make_scoped_ptr(new FilteringFileEnumerator( |
| - IsolatedFileUtil::CreateFileEnumerator(context, root_url), |
| - GetMediaPathFilter(context))) |
| - .PassAs<FileSystemFileUtil::AbstractFileEnumerator>(); |
| +bool NativeMediaFileUtil::CreateDirectory( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + bool exclusive, |
| + bool recursive, |
| + const StatusCallback& callback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| + return context->task_runner()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&NativeMediaFileUtil::CreateDirectoryOnTaskRunnerThread, |
| + weak_factory_.GetWeakPtr(), context, url, exclusive, |
| + recursive, callback)); |
| +} |
| + |
| +bool NativeMediaFileUtil::GetFileInfo( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + const GetFileInfoCallback& callback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| + return context->task_runner()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&NativeMediaFileUtil::GetFileInfoOnTaskRunnerThread, |
| + weak_factory_.GetWeakPtr(), context, url, callback)); |
| } |
| -PlatformFileError NativeMediaFileUtil::Touch( |
| - FileSystemOperationContext* context, |
| - const FileSystemURL& url, |
| +bool NativeMediaFileUtil::ReadDirectory( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + const ReadDirectoryCallback& callback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| + return context->task_runner()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&NativeMediaFileUtil::ReadDirectoryOnTaskRunnerThread, |
| + weak_factory_.GetWeakPtr(), context, url, callback)); |
| +} |
| + |
| +bool NativeMediaFileUtil::Touch( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| const base::Time& last_access_time, |
| - const base::Time& last_modified_time) { |
| + const base::Time& last_modified_time, |
| + const StatusCallback& callback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| + callback.Run(base::PLATFORM_FILE_ERROR_SECURITY); |
| + return true; |
| +} |
| + |
| +bool NativeMediaFileUtil::Truncate( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + int64 length, |
| + const StatusCallback& callback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| + callback.Run(base::PLATFORM_FILE_ERROR_SECURITY); |
| + return true; |
| +} |
| + |
| +bool NativeMediaFileUtil::CopyFileLocal( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& src_url, |
| + const fileapi::FileSystemURL& dest_url, |
| + const StatusCallback& callback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| + return context->task_runner()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&NativeMediaFileUtil::CopyOrMoveFileLocalOnTaskRunnerThread, |
| + weak_factory_.GetWeakPtr(), context, src_url, dest_url, |
| + true /* copy */, callback)); |
| +} |
| + |
| +bool NativeMediaFileUtil::MoveFileLocal( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& src_url, |
| + const fileapi::FileSystemURL& dest_url, |
| + const StatusCallback& callback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| + return context->task_runner()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&NativeMediaFileUtil::CopyOrMoveFileLocalOnTaskRunnerThread, |
| + weak_factory_.GetWeakPtr(), context, src_url, dest_url, |
| + false /* copy */, callback)); |
| +} |
| + |
| +bool NativeMediaFileUtil::CopyInForeignFile( |
| + fileapi::FileSystemOperationContext* context, |
| + const base::FilePath& src_file_path, |
| + const fileapi::FileSystemURL& dest_url, |
| + const StatusCallback& callback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| + return context->task_runner()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&NativeMediaFileUtil::CopyInForeignFileOnTaskRunnerThread, |
| + weak_factory_.GetWeakPtr(), context, src_file_path, dest_url, |
| + callback)); |
| +} |
| + |
| +bool NativeMediaFileUtil::DeleteFile( |
|
Lei Zhang
2013/06/03 10:05:46
Seems weird that we can delete directories, but no
vandebo (ex-Chrome)
2013/06/03 19:15:26
I assume this if for Move - we need to recursively
|
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + const StatusCallback& callback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| + callback.Run(base::PLATFORM_FILE_ERROR_SECURITY); |
| + return true; |
| +} |
| + |
| +bool NativeMediaFileUtil::DeleteDirectory( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + const StatusCallback& callback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| + return context->task_runner()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&NativeMediaFileUtil::DeleteDirectoryOnTaskRunnerThread, |
| + weak_factory_.GetWeakPtr(), context, url, callback)); |
| +} |
| + |
| +bool NativeMediaFileUtil::CreateSnapshotFile( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + const CreateSnapshotFileCallback& callback) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| + return context->task_runner()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&NativeMediaFileUtil::CreateSnapshotFileOnTaskRunnerThread, |
| + weak_factory_.GetWeakPtr(), context, url, callback)); |
| +} |
| + |
| +base::PlatformFileError NativeMediaFileUtil::CreateDirectorySync( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + bool exclusive, |
| + bool recursive) { |
| base::FilePath file_path; |
| - PlatformFileError error = GetFilteredLocalFilePathForExistingFileOrDirectory( |
| - context, |
| - url, |
| - // Touch fails for non-existent paths and filtered paths. |
| - base::PLATFORM_FILE_ERROR_FAILED, |
| - &file_path); |
| + base::PlatformFileError error = GetLocalFilePath(context, url, &file_path); |
| if (error != base::PLATFORM_FILE_OK) |
| return error; |
| - return NativeFileUtil::Touch(file_path, last_access_time, last_modified_time); |
| + return fileapi::NativeFileUtil::CreateDirectory(file_path, exclusive, |
| + recursive); |
| } |
| -PlatformFileError NativeMediaFileUtil::Truncate( |
| - FileSystemOperationContext* context, |
| - const FileSystemURL& url, |
| - int64 length) { |
| - base::FilePath file_path; |
| - PlatformFileError error = GetFilteredLocalFilePathForExistingFileOrDirectory( |
| - context, |
| - url, |
| - // Cannot truncate paths that do not exist, or are filtered. |
| - base::PLATFORM_FILE_ERROR_NOT_FOUND, |
| - &file_path); |
| +base::PlatformFileError NativeMediaFileUtil::GetLocalFilePath( |
|
Lei Zhang
2013/06/03 10:05:46
This is identical to IsolatedFileUtil::GetLocalFil
vandebo (ex-Chrome)
2013/06/03 19:15:26
It's not static and is protected, so there isn't a
|
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + base::FilePath* local_file_path) { |
| + DCHECK(local_file_path); |
| + DCHECK(url.is_valid()); |
| + if (url.path().empty()) { |
| + // Root direcory case, which should not be accessed. |
| + return base::PLATFORM_FILE_ERROR_ACCESS_DENIED; |
| + } |
| + *local_file_path = url.path(); |
| + return base::PLATFORM_FILE_OK; |
| +} |
| + |
| +base::PlatformFileError NativeMediaFileUtil::ReadDirectorySync( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + EntryList* file_list) { |
| + DCHECK(IsOnTaskRunnerThread(context)); |
| + DCHECK(file_list); |
| + DCHECK(file_list->empty()); |
| + base::PlatformFileInfo file_info; |
| + base::FilePath platform_path; |
| + base::PlatformFileError error = GetFileInfoSync(context, url, &file_info, |
| + &platform_path); |
| + |
| + if (error == base::PLATFORM_FILE_OK && !file_info.is_directory) |
|
Lei Zhang
2013/06/03 10:05:46
do this after check on line 290
vandebo (ex-Chrome)
2013/06/03 19:15:26
Done.
|
| + return base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY; |
| + |
| if (error != base::PLATFORM_FILE_OK) |
| return error; |
| - return NativeFileUtil::Truncate(file_path, length); |
| + |
| + file_util::FileEnumerator file_enum( |
| + platform_path, |
| + false /* recursive */, |
| + file_util::FileEnumerator::FILES | |
| + file_util::FileEnumerator::DIRECTORIES); |
| + file_util::FileEnumerator::FindInfo file_util_info; |
| +#if defined(OS_WIN) |
| + memset(&file_util_info, 0, sizeof(file_util_info)); |
| +#endif // defined(OS_WIN) |
| + |
| + for (base::FilePath platform_path = file_enum.Next(); |
| + !platform_path.empty(); |
| + platform_path = file_enum.Next()) { |
| + // Skip symlinks. |
| + if (file_util::IsLink(platform_path)) |
| + continue; |
| + |
| + file_enum.GetFindInfo(&file_util_info); |
| + |
| + // NativeMediaFileUtil skip criteria. |
| + if (ShouldSkip(platform_path)) |
| + continue; |
| + if (!file_util::FileEnumerator::IsDirectory(file_util_info) && |
| + !GetMediaPathFilter(context)->Match(platform_path)) |
| + continue; |
| + |
| + fileapi::DirectoryEntry entry; |
| + entry.is_directory = file_util::FileEnumerator::IsDirectory(file_util_info); |
| + entry.name = platform_path.BaseName().value(); |
| + entry.size = file_util::FileEnumerator::GetFilesize(file_util_info); |
| + entry.last_modified_time = |
| + file_util::FileEnumerator::GetLastModifiedTime(file_util_info); |
| + |
| + file_list->push_back(entry); |
| + } |
| + |
| + return base::PLATFORM_FILE_OK; |
| } |
| -PlatformFileError NativeMediaFileUtil::CopyOrMoveFile( |
| - FileSystemOperationContext* context, |
| - const FileSystemURL& src_url, |
| - const FileSystemURL& dest_url, |
| +base::PlatformFileError NativeMediaFileUtil::CopyOrMoveFileSync( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& src_url, |
| + const fileapi::FileSystemURL& dest_url, |
| bool copy) { |
| + DCHECK(IsOnTaskRunnerThread(context)); |
| base::FilePath src_file_path; |
| - PlatformFileError error = |
| + base::PlatformFileError error = |
| GetFilteredLocalFilePathForExistingFileOrDirectory( |
| context, src_url, |
| base::PLATFORM_FILE_ERROR_NOT_FOUND, |
| &src_file_path); |
| if (error != base::PLATFORM_FILE_OK) |
| return error; |
| - if (NativeFileUtil::DirectoryExists(src_file_path)) |
| + if (fileapi::NativeFileUtil::DirectoryExists(src_file_path)) |
| return base::PLATFORM_FILE_ERROR_NOT_A_FILE; |
| base::FilePath dest_file_path; |
| error = GetLocalFilePath(context, dest_url, &dest_file_path); |
| if (error != base::PLATFORM_FILE_OK) |
| return error; |
| - PlatformFileInfo file_info; |
| - error = NativeFileUtil::GetFileInfo(dest_file_path, &file_info); |
| + base::PlatformFileInfo file_info; |
| + error = fileapi::NativeFileUtil::GetFileInfo(dest_file_path, &file_info); |
| if (error != base::PLATFORM_FILE_OK && |
| error != base::PLATFORM_FILE_ERROR_NOT_FOUND) |
| return error; |
| @@ -148,95 +360,89 @@ PlatformFileError NativeMediaFileUtil::CopyOrMoveFile( |
| if (!GetMediaPathFilter(context)->Match(dest_file_path)) |
| return base::PLATFORM_FILE_ERROR_SECURITY; |
| - return NativeFileUtil::CopyOrMoveFile(src_file_path, dest_file_path, copy); |
| + return fileapi::NativeFileUtil::CopyOrMoveFile(src_file_path, dest_file_path, |
| + copy); |
| } |
| -PlatformFileError NativeMediaFileUtil::CopyInForeignFile( |
| - FileSystemOperationContext* context, |
| +base::PlatformFileError NativeMediaFileUtil::CopyInForeignFileSync( |
| + fileapi::FileSystemOperationContext* context, |
| const base::FilePath& src_file_path, |
| - const FileSystemURL& dest_url) { |
| + const fileapi::FileSystemURL& dest_url) { |
| + DCHECK(IsOnTaskRunnerThread(context)); |
| if (src_file_path.empty()) |
| return base::PLATFORM_FILE_ERROR_INVALID_OPERATION; |
| base::FilePath dest_file_path; |
| - PlatformFileError error = |
| + base::PlatformFileError error = |
| GetFilteredLocalFilePath(context, dest_url, &dest_file_path); |
| if (error != base::PLATFORM_FILE_OK) |
| return error; |
| - return NativeFileUtil::CopyOrMoveFile(src_file_path, dest_file_path, true); |
| + return fileapi::NativeFileUtil::CopyOrMoveFile(src_file_path, dest_file_path, |
| + true); |
| } |
| -PlatformFileError NativeMediaFileUtil::DeleteFile( |
| - FileSystemOperationContext* context, |
| - const FileSystemURL& url) { |
| +base::PlatformFileError NativeMediaFileUtil::GetFilteredLocalFilePath( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& file_system_url, |
| + base::FilePath* local_file_path) { |
| + DCHECK(IsOnTaskRunnerThread(context)); |
| base::FilePath file_path; |
| - PlatformFileError error = GetLocalFilePath(context, url, &file_path); |
| - if (error != base::PLATFORM_FILE_OK) |
| - return error; |
| - PlatformFileInfo file_info; |
| - error = NativeFileUtil::GetFileInfo(file_path, &file_info); |
| + base::PlatformFileError error = |
| + GetLocalFilePath(context, file_system_url, &file_path); |
| if (error != base::PLATFORM_FILE_OK) |
| return error; |
| - if (file_info.is_directory) |
| - return base::PLATFORM_FILE_ERROR_NOT_A_FILE; |
| if (!GetMediaPathFilter(context)->Match(file_path)) |
| - return base::PLATFORM_FILE_ERROR_NOT_FOUND; |
| - return NativeFileUtil::DeleteFile(file_path); |
| + return base::PLATFORM_FILE_ERROR_SECURITY; |
| + |
| + *local_file_path = file_path; |
| + return base::PLATFORM_FILE_OK; |
| } |
| -PlatformFileError NativeMediaFileUtil::GetFileInfo( |
| - FileSystemOperationContext* context, |
| - const FileSystemURL& url, |
| - PlatformFileInfo* file_info, |
| +base::PlatformFileError NativeMediaFileUtil::GetFileInfoSync( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + base::PlatformFileInfo* file_info, |
| base::FilePath* platform_path) { |
| + DCHECK(IsOnTaskRunnerThread(context)); |
| DCHECK(context); |
| - DCHECK(GetMediaPathFilter(context)); |
| DCHECK(file_info); |
| - DCHECK(platform_path); |
| + DCHECK(GetMediaPathFilter(context)); |
| - base::PlatformFileError error = |
| - IsolatedFileUtil::GetFileInfo(context, url, file_info, platform_path); |
| + base::FilePath file_path; |
| + base::PlatformFileError error = GetLocalFilePath(context, url, &file_path); |
| + if (error != base::PLATFORM_FILE_OK) |
| + return error; |
| + if (file_util::IsLink(file_path)) |
| + return base::PLATFORM_FILE_ERROR_NOT_FOUND; |
| + error = fileapi::NativeFileUtil::GetFileInfo(file_path, file_info); |
| if (error != base::PLATFORM_FILE_OK) |
| return error; |
| + if (platform_path) |
| + *platform_path = file_path; |
| if (file_info->is_directory || |
| - GetMediaPathFilter(context)->Match(*platform_path)) { |
| + GetMediaPathFilter(context)->Match(file_path)) { |
| return base::PLATFORM_FILE_OK; |
| } |
| return base::PLATFORM_FILE_ERROR_NOT_FOUND; |
| } |
| -PlatformFileError NativeMediaFileUtil::GetFilteredLocalFilePath( |
| - FileSystemOperationContext* context, |
| - const FileSystemURL& file_system_url, |
| - base::FilePath* local_file_path) { |
| - base::FilePath file_path; |
| - PlatformFileError error = |
| - IsolatedFileUtil::GetLocalFilePath(context, file_system_url, &file_path); |
| - if (error != base::PLATFORM_FILE_OK) |
| - return error; |
| - if (!GetMediaPathFilter(context)->Match(file_path)) |
| - return base::PLATFORM_FILE_ERROR_SECURITY; |
| - |
| - *local_file_path = file_path; |
| - return base::PLATFORM_FILE_OK; |
| -} |
| - |
| -PlatformFileError |
| +base::PlatformFileError |
| NativeMediaFileUtil::GetFilteredLocalFilePathForExistingFileOrDirectory( |
| - FileSystemOperationContext* context, |
| - const FileSystemURL& file_system_url, |
| - PlatformFileError failure_error, |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& file_system_url, |
| + base::PlatformFileError failure_error, |
| base::FilePath* local_file_path) { |
| + DCHECK(IsOnTaskRunnerThread(context)); |
| base::FilePath file_path; |
| - PlatformFileError error = |
| + base::PlatformFileError error = |
| GetLocalFilePath(context, file_system_url, &file_path); |
| if (error != base::PLATFORM_FILE_OK) |
| return error; |
| if (!file_util::PathExists(file_path)) |
| return failure_error; |
| - PlatformFileInfo file_info; |
| + base::PlatformFileInfo file_info; |
| if (!file_util::GetFileInfo(file_path, &file_info)) |
| return base::PLATFORM_FILE_ERROR_FAILED; |
| @@ -249,22 +455,35 @@ NativeMediaFileUtil::GetFilteredLocalFilePathForExistingFileOrDirectory( |
| return base::PLATFORM_FILE_OK; |
| } |
| -webkit_blob::ScopedFile NativeMediaFileUtil::CreateSnapshotFile( |
| +base::PlatformFileError NativeMediaFileUtil::DeleteDirectorySync( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url) { |
| + DCHECK(IsOnTaskRunnerThread(context)); |
| + base::FilePath file_path; |
| + base::PlatformFileError error = GetLocalFilePath(context, url, &file_path); |
| + if (error != base::PLATFORM_FILE_OK) |
| + return error; |
| + return fileapi::NativeFileUtil::DeleteDirectory(file_path); |
| +} |
| + |
| +base::PlatformFileError NativeMediaFileUtil::CreateSnapshotFileSync( |
| fileapi::FileSystemOperationContext* context, |
| const fileapi::FileSystemURL& url, |
| - base::PlatformFileError* error, |
| base::PlatformFileInfo* file_info, |
| - base::FilePath* platform_path) { |
| + base::FilePath* platform_path, |
| + scoped_refptr<webkit_blob::ShareableFileReference>* file_ref) { |
| DCHECK(IsOnTaskRunnerThread(context)); |
| - webkit_blob::ScopedFile file; |
| - file = IsolatedFileUtil::CreateSnapshotFile( |
| - context, url, error, file_info, platform_path); |
| - if (*error != base::PLATFORM_FILE_OK) |
| - return file.Pass(); |
| - *error = IsMediaFile(*platform_path); |
| - if (*error == base::PLATFORM_FILE_OK) |
| - return file.Pass(); |
| - return webkit_blob::ScopedFile(); |
| + base::PlatformFileError error = |
| + GetFileInfoSync(context, url, file_info, platform_path); |
| + if (error == base::PLATFORM_FILE_OK && file_info->is_directory) |
| + error = base::PLATFORM_FILE_ERROR_NOT_A_FILE; |
| + if (error == base::PLATFORM_FILE_OK) |
| + error = NativeMediaFileUtil::IsMediaFile(*platform_path); |
| + |
| + // We're just returning the local file information. |
| + *file_ref = scoped_refptr<webkit_blob::ShareableFileReference>(); |
| + |
| + return error; |
| } |
| // static |
| @@ -273,7 +492,7 @@ base::PlatformFileError NativeMediaFileUtil::IsMediaFile( |
| base::PlatformFile file_handle; |
| const int flags = base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ; |
| base::PlatformFileError error = |
| - NativeFileUtil::CreateOrOpen(path, flags, &file_handle, NULL); |
| + fileapi::NativeFileUtil::CreateOrOpen(path, flags, &file_handle, NULL); |
| if (error != base::PLATFORM_FILE_OK) |
| return error; |
| @@ -301,4 +520,106 @@ base::PlatformFileError NativeMediaFileUtil::IsMediaFile( |
| return base::PLATFORM_FILE_ERROR_SECURITY; |
| } |
| +void NativeMediaFileUtil::CreateDirectoryOnTaskRunnerThread( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + bool exclusive, |
| + bool recursive, |
| + const StatusCallback& callback) { |
| + DCHECK(IsOnTaskRunnerThread(context)); |
| + base::PlatformFileError error = |
| + CreateDirectorySync(context, url, exclusive, recursive); |
| + content::BrowserThread::PostTask( |
| + content::BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(callback, error)); |
| +} |
| + |
| +void NativeMediaFileUtil::GetFileInfoOnTaskRunnerThread( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + const GetFileInfoCallback& callback) { |
| + DCHECK(IsOnTaskRunnerThread(context)); |
| + base::PlatformFileInfo file_info; |
| + base::FilePath platform_path; |
| + base::PlatformFileError error = |
| + GetFileInfoSync(context, url, &file_info, &platform_path); |
| + content::BrowserThread::PostTask( |
| + content::BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(callback, error, file_info, platform_path)); |
| +} |
| + |
| +void NativeMediaFileUtil::ReadDirectoryOnTaskRunnerThread( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + const ReadDirectoryCallback& callback) { |
| + DCHECK(IsOnTaskRunnerThread(context)); |
| + EntryList entry_list; |
| + base::PlatformFileError error = |
| + ReadDirectorySync(context, url, &entry_list); |
| + content::BrowserThread::PostTask( |
| + content::BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(callback, error, entry_list, false /* has_more */)); |
| +} |
| + |
| +void NativeMediaFileUtil::CopyOrMoveFileLocalOnTaskRunnerThread( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& src_url, |
| + const fileapi::FileSystemURL& dest_url, |
| + bool copy, |
| + const StatusCallback& callback) { |
| + DCHECK(IsOnTaskRunnerThread(context)); |
| + base::PlatformFileError error = |
| + CopyOrMoveFileSync(context, src_url, dest_url, copy); |
| + content::BrowserThread::PostTask( |
| + content::BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(callback, error)); |
| +} |
| + |
| +void NativeMediaFileUtil::CopyInForeignFileOnTaskRunnerThread( |
| + fileapi::FileSystemOperationContext* context, |
| + const base::FilePath& src_file_path, |
| + const fileapi::FileSystemURL& dest_url, |
| + const StatusCallback& callback) { |
| + DCHECK(IsOnTaskRunnerThread(context)); |
| + base::PlatformFileError error = |
| + CopyInForeignFileSync(context, src_file_path, dest_url); |
| + content::BrowserThread::PostTask( |
| + content::BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(callback, error)); |
| +} |
| + |
| +void NativeMediaFileUtil::DeleteDirectoryOnTaskRunnerThread( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + const StatusCallback& callback) { |
| + DCHECK(IsOnTaskRunnerThread(context)); |
| + base::PlatformFileError error = DeleteDirectorySync(context, url); |
| + content::BrowserThread::PostTask( |
| + content::BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(callback, error)); |
| +} |
| + |
| +void NativeMediaFileUtil::CreateSnapshotFileOnTaskRunnerThread( |
| + fileapi::FileSystemOperationContext* context, |
| + const fileapi::FileSystemURL& url, |
| + const CreateSnapshotFileCallback& callback) { |
| + DCHECK(IsOnTaskRunnerThread(context)); |
| + base::PlatformFileInfo file_info; |
| + base::FilePath platform_path; |
| + scoped_refptr<webkit_blob::ShareableFileReference> file_ref; |
| + base::PlatformFileError error = |
| + CreateSnapshotFileSync(context, url, &file_info, &platform_path, |
| + &file_ref); |
| + content::BrowserThread::PostTask( |
| + content::BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(callback, error, file_info, platform_path, file_ref)); |
| +} |
| + |
| } // namespace chrome |