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

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

Issue 16304002: Make NativeMediaFileUtil an AsyncFileUtil (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Remove debug statement Created 7 years, 6 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/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..38612399dde91e67f4be34b28a82ffe75dca177c 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,334 @@ 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,
+NativeMediaFileUtil::~NativeMediaFileUtil() {
+}
+
+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);
+ if (!callback.is_null()) {
+ 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));
+ if (!callback.is_null())
+ callback.Run(base::PLATFORM_FILE_ERROR_SECURITY, false);
+ 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));
+ if (!callback.is_null())
+ 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));
+ if (!callback.is_null())
+ 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(
+ fileapi::FileSystemOperationContext* context,
+ const fileapi::FileSystemURL& url,
+ const StatusCallback& callback) {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
+ if (!callback.is_null())
+ callback.Run(base::PLATFORM_FILE_ERROR_SECURITY);
+ return true;
+}
+
+// This is needed to support Copy and Move.
+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(
+ 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)
return error;
- return NativeFileUtil::Truncate(file_path, length);
+
+ if (!file_info.is_directory)
+ return base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY;
+
+ 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 +370,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 +465,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 +502,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 +530,120 @@ 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);
+ if (callback.is_null())
+ return;
+ 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);
+ if (callback.is_null())
+ return;
+ 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);
+ if (callback.is_null())
+ return;
+ 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);
+ if (callback.is_null())
+ return;
+ 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);
+ if (callback.is_null())
+ return;
+ 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);
+ if (callback.is_null())
+ return;
+ 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);
+ if (callback.is_null())
+ return;
+ content::BrowserThread::PostTask(
+ content::BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(callback, error, file_info, platform_path, file_ref));
+}
+
} // namespace chrome

Powered by Google App Engine
This is Rietveld 408576698