| Index: content/browser/file_system/file_and_blob_message_filter.cc
|
| diff --git a/content/browser/file_system/file_and_blob_message_filter.cc b/content/browser/file_system/file_and_blob_message_filter.cc
|
| deleted file mode 100644
|
| index 1486095356c4a04fd0f532b16042ed2ca90f2fec..0000000000000000000000000000000000000000
|
| --- a/content/browser/file_system/file_and_blob_message_filter.cc
|
| +++ /dev/null
|
| @@ -1,662 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/browser/file_system/file_and_blob_message_filter.h"
|
| -
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/file_path.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/platform_file.h"
|
| -#include "base/threading/thread.h"
|
| -#include "base/time.h"
|
| -#include "content/browser/child_process_security_policy_impl.h"
|
| -#include "content/browser/chrome_blob_storage_context.h"
|
| -#include "content/common/file_system_messages.h"
|
| -#include "content/common/webblob_messages.h"
|
| -#include "content/public/browser/user_metrics.h"
|
| -#include "googleurl/src/gurl.h"
|
| -#include "ipc/ipc_platform_file.h"
|
| -#include "net/base/mime_util.h"
|
| -#include "net/url_request/url_request_context.h"
|
| -#include "net/url_request/url_request_context_getter.h"
|
| -#include "webkit/blob/blob_data.h"
|
| -#include "webkit/blob/blob_storage_controller.h"
|
| -#include "webkit/blob/shareable_file_reference.h"
|
| -#include "webkit/fileapi/file_system_context.h"
|
| -#include "webkit/fileapi/file_system_operation.h"
|
| -#include "webkit/fileapi/file_system_quota_util.h"
|
| -#include "webkit/fileapi/file_system_util.h"
|
| -#include "webkit/fileapi/sandbox_mount_point_provider.h"
|
| -
|
| -using content::BrowserMessageFilter;
|
| -using content::BrowserThread;
|
| -using content::UserMetricsAction;
|
| -using fileapi::FileSystemFileUtil;
|
| -using fileapi::FileSystemMountPointProvider;
|
| -using fileapi::FileSystemOperation;
|
| -using fileapi::FileSystemOperationInterface;
|
| -using webkit_blob::BlobData;
|
| -using webkit_blob::BlobStorageController;
|
| -
|
| -namespace {
|
| -
|
| -const int kReadFilePermissions = base::PLATFORM_FILE_OPEN |
|
| - base::PLATFORM_FILE_READ |
|
| - base::PLATFORM_FILE_EXCLUSIVE_READ |
|
| - base::PLATFORM_FILE_ASYNC;
|
| -
|
| -const int kWriteFilePermissions = base::PLATFORM_FILE_OPEN |
|
| - base::PLATFORM_FILE_WRITE |
|
| - base::PLATFORM_FILE_EXCLUSIVE_WRITE |
|
| - base::PLATFORM_FILE_ASYNC |
|
| - base::PLATFORM_FILE_WRITE_ATTRIBUTES;
|
| -
|
| -const int kCreateFilePermissions = base::PLATFORM_FILE_CREATE;
|
| -
|
| -const int kOpenFilePermissions = base::PLATFORM_FILE_CREATE |
|
| - base::PLATFORM_FILE_OPEN_ALWAYS |
|
| - base::PLATFORM_FILE_CREATE_ALWAYS |
|
| - base::PLATFORM_FILE_OPEN_TRUNCATED |
|
| - base::PLATFORM_FILE_WRITE |
|
| - base::PLATFORM_FILE_EXCLUSIVE_WRITE |
|
| - base::PLATFORM_FILE_DELETE_ON_CLOSE |
|
| - base::PLATFORM_FILE_WRITE_ATTRIBUTES;
|
| -
|
| -} // namespace
|
| -
|
| -FileAndBlobMessageFilter::FileAndBlobMessageFilter(
|
| - int process_id,
|
| - net::URLRequestContextGetter* request_context_getter,
|
| - fileapi::FileSystemContext* file_system_context,
|
| - ChromeBlobStorageContext* blob_storage_context)
|
| - : process_id_(process_id),
|
| - context_(file_system_context),
|
| - request_context_getter_(request_context_getter),
|
| - request_context_(NULL),
|
| - blob_storage_context_(blob_storage_context) {
|
| - DCHECK(context_);
|
| - DCHECK(request_context_getter_);
|
| - DCHECK(blob_storage_context);
|
| -}
|
| -
|
| -FileAndBlobMessageFilter::FileAndBlobMessageFilter(
|
| - int process_id,
|
| - net::URLRequestContext* request_context,
|
| - fileapi::FileSystemContext* file_system_context,
|
| - ChromeBlobStorageContext* blob_storage_context)
|
| - : process_id_(process_id),
|
| - context_(file_system_context),
|
| - request_context_(request_context),
|
| - blob_storage_context_(blob_storage_context) {
|
| - DCHECK(context_);
|
| - DCHECK(request_context_);
|
| - DCHECK(blob_storage_context);
|
| -}
|
| -
|
| -FileAndBlobMessageFilter::~FileAndBlobMessageFilter() {
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnChannelConnected(int32 peer_pid) {
|
| - BrowserMessageFilter::OnChannelConnected(peer_pid);
|
| -
|
| - if (request_context_getter_.get()) {
|
| - DCHECK(!request_context_);
|
| - request_context_ = request_context_getter_->GetURLRequestContext();
|
| - request_context_getter_ = NULL;
|
| - DCHECK(request_context_);
|
| - }
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnChannelClosing() {
|
| - BrowserMessageFilter::OnChannelClosing();
|
| -
|
| - // Unregister all the blob URLs that are previously registered in this
|
| - // process.
|
| - for (base::hash_set<std::string>::const_iterator iter = blob_urls_.begin();
|
| - iter != blob_urls_.end(); ++iter) {
|
| - blob_storage_context_->controller()->RemoveBlob(GURL(*iter));
|
| - }
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OverrideThreadForMessage(
|
| - const IPC::Message& message,
|
| - BrowserThread::ID* thread) {
|
| - if (message.type() == FileSystemHostMsg_SyncGetPlatformPath::ID)
|
| - *thread = BrowserThread::FILE;
|
| -}
|
| -
|
| -bool FileAndBlobMessageFilter::OnMessageReceived(
|
| - const IPC::Message& message, bool* message_was_ok) {
|
| - *message_was_ok = true;
|
| - bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP_EX(FileAndBlobMessageFilter, message, *message_was_ok)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_Open, OnOpen)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_Move, OnMove)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_Copy, OnCopy)
|
| - IPC_MESSAGE_HANDLER(FileSystemMsg_Remove, OnRemove)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_ReadMetadata, OnReadMetadata)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_Create, OnCreate)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_Exists, OnExists)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_ReadDirectory, OnReadDirectory)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_Write, OnWrite)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_Truncate, OnTruncate)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_TouchFile, OnTouchFile)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_CancelWrite, OnCancel)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_OpenFile, OnOpenFile)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_CreateSnapshotFile,
|
| - OnCreateSnapshotFile)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_WillUpdate, OnWillUpdate)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_DidUpdate, OnDidUpdate)
|
| - IPC_MESSAGE_HANDLER(FileSystemHostMsg_SyncGetPlatformPath,
|
| - OnSyncGetPlatformPath)
|
| - IPC_MESSAGE_HANDLER(BlobHostMsg_StartBuildingBlob, OnStartBuildingBlob)
|
| - IPC_MESSAGE_HANDLER(BlobHostMsg_AppendBlobDataItem, OnAppendBlobDataItem)
|
| - IPC_MESSAGE_HANDLER(BlobHostMsg_SyncAppendSharedMemory,
|
| - OnAppendSharedMemory)
|
| - IPC_MESSAGE_HANDLER(BlobHostMsg_FinishBuildingBlob, OnFinishBuildingBlob)
|
| - IPC_MESSAGE_HANDLER(BlobHostMsg_CloneBlob, OnCloneBlob)
|
| - IPC_MESSAGE_HANDLER(BlobHostMsg_RemoveBlob, OnRemoveBlob)
|
| - IPC_MESSAGE_UNHANDLED(handled = false)
|
| - IPC_END_MESSAGE_MAP_EX()
|
| - return handled;
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnOpen(
|
| - int request_id, const GURL& origin_url, fileapi::FileSystemType type,
|
| - int64 requested_size, bool create) {
|
| - if (type == fileapi::kFileSystemTypeTemporary) {
|
| - content::RecordAction(UserMetricsAction("OpenFileSystemTemporary"));
|
| - } else if (type == fileapi::kFileSystemTypePersistent) {
|
| - content::RecordAction(UserMetricsAction("OpenFileSystemPersistent"));
|
| - }
|
| - context_->OpenFileSystem(origin_url, type, create, base::Bind(
|
| - &FileAndBlobMessageFilter::DidOpenFileSystem, this, request_id));
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnMove(
|
| - int request_id, const GURL& src_path, const GURL& dest_path) {
|
| - base::PlatformFileError error;
|
| - const int src_permissions = kReadFilePermissions | kWriteFilePermissions;
|
| - if (!HasPermissionsForFile(src_path, src_permissions, &error) ||
|
| - !HasPermissionsForFile(dest_path, kCreateFilePermissions, &error)) {
|
| - Send(new FileSystemMsg_DidFail(request_id, error));
|
| - return;
|
| - }
|
| -
|
| - GetNewOperation(src_path, request_id)->Move(
|
| - src_path, dest_path,
|
| - base::Bind(&FileAndBlobMessageFilter::DidFinish, this, request_id));
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnCopy(
|
| - int request_id, const GURL& src_path, const GURL& dest_path) {
|
| - base::PlatformFileError error;
|
| - if (!HasPermissionsForFile(src_path, kReadFilePermissions, &error) ||
|
| - !HasPermissionsForFile(dest_path, kCreateFilePermissions, &error)) {
|
| - Send(new FileSystemMsg_DidFail(request_id, error));
|
| - return;
|
| - }
|
| -
|
| - GetNewOperation(src_path, request_id)->Copy(
|
| - src_path, dest_path,
|
| - base::Bind(&FileAndBlobMessageFilter::DidFinish, this, request_id));
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnRemove(
|
| - int request_id, const GURL& path, bool recursive) {
|
| - base::PlatformFileError error;
|
| - if (!HasPermissionsForFile(path, kWriteFilePermissions, &error)) {
|
| - Send(new FileSystemMsg_DidFail(request_id, error));
|
| - return;
|
| - }
|
| -
|
| - GetNewOperation(path, request_id)->Remove(
|
| - path, recursive,
|
| - base::Bind(&FileAndBlobMessageFilter::DidFinish, this, request_id));
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnReadMetadata(
|
| - int request_id, const GURL& path) {
|
| - base::PlatformFileError error;
|
| - if (!HasPermissionsForFile(path, kReadFilePermissions, &error)) {
|
| - Send(new FileSystemMsg_DidFail(request_id, error));
|
| - return;
|
| - }
|
| -
|
| - GetNewOperation(path, request_id)->GetMetadata(
|
| - path,
|
| - base::Bind(&FileAndBlobMessageFilter::DidGetMetadata, this, request_id));
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnCreate(
|
| - int request_id, const GURL& path, bool exclusive,
|
| - bool is_directory, bool recursive) {
|
| - base::PlatformFileError error;
|
| - if (!HasPermissionsForFile(path, kCreateFilePermissions, &error)) {
|
| - Send(new FileSystemMsg_DidFail(request_id, error));
|
| - return;
|
| - }
|
| -
|
| - if (is_directory) {
|
| - GetNewOperation(path, request_id)->CreateDirectory(
|
| - path, exclusive, recursive,
|
| - base::Bind(&FileAndBlobMessageFilter::DidFinish, this, request_id));
|
| - } else {
|
| - GetNewOperation(path, request_id)->CreateFile(
|
| - path, exclusive,
|
| - base::Bind(&FileAndBlobMessageFilter::DidFinish, this, request_id));
|
| - }
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnExists(
|
| - int request_id, const GURL& path, bool is_directory) {
|
| - base::PlatformFileError error;
|
| - if (!HasPermissionsForFile(path, kReadFilePermissions, &error)) {
|
| - Send(new FileSystemMsg_DidFail(request_id, error));
|
| - return;
|
| - }
|
| -
|
| - if (is_directory) {
|
| - GetNewOperation(path, request_id)->DirectoryExists(
|
| - path,
|
| - base::Bind(&FileAndBlobMessageFilter::DidFinish, this, request_id));
|
| - } else {
|
| - GetNewOperation(path, request_id)->FileExists(
|
| - path,
|
| - base::Bind(&FileAndBlobMessageFilter::DidFinish, this, request_id));
|
| - }
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnReadDirectory(
|
| - int request_id, const GURL& path) {
|
| - base::PlatformFileError error;
|
| - if (!HasPermissionsForFile(path, kReadFilePermissions, &error)) {
|
| - Send(new FileSystemMsg_DidFail(request_id, error));
|
| - return;
|
| - }
|
| -
|
| - GetNewOperation(path, request_id)->ReadDirectory(
|
| - path, base::Bind(&FileAndBlobMessageFilter::DidReadDirectory,
|
| - this, request_id));
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnWrite(
|
| - int request_id,
|
| - const GURL& path,
|
| - const GURL& blob_url,
|
| - int64 offset) {
|
| - if (!request_context_) {
|
| - // We can't write w/o a request context, trying to do so will crash.
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| -
|
| - base::PlatformFileError error;
|
| - if (!HasPermissionsForFile(path, kWriteFilePermissions, &error)) {
|
| - Send(new FileSystemMsg_DidFail(request_id, error));
|
| - return;
|
| - }
|
| -
|
| - GetNewOperation(path, request_id)->Write(
|
| - request_context_, path, blob_url, offset,
|
| - base::Bind(&FileAndBlobMessageFilter::DidWrite, this, request_id));
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnTruncate(
|
| - int request_id,
|
| - const GURL& path,
|
| - int64 length) {
|
| - base::PlatformFileError error;
|
| - if (!HasPermissionsForFile(path, kWriteFilePermissions, &error)) {
|
| - Send(new FileSystemMsg_DidFail(request_id, error));
|
| - return;
|
| - }
|
| -
|
| - GetNewOperation(path, request_id)->Truncate(
|
| - path, length,
|
| - base::Bind(&FileAndBlobMessageFilter::DidFinish, this, request_id));
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnTouchFile(
|
| - int request_id,
|
| - const GURL& path,
|
| - const base::Time& last_access_time,
|
| - const base::Time& last_modified_time) {
|
| - base::PlatformFileError error;
|
| - if (!HasPermissionsForFile(path, kCreateFilePermissions, &error)) {
|
| - Send(new FileSystemMsg_DidFail(request_id, error));
|
| - return;
|
| - }
|
| -
|
| - GetNewOperation(path, request_id)->TouchFile(
|
| - path, last_access_time, last_modified_time,
|
| - base::Bind(&FileAndBlobMessageFilter::DidFinish, this, request_id));
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnCancel(
|
| - int request_id,
|
| - int request_id_to_cancel) {
|
| - FileSystemOperationInterface* write = operations_.Lookup(
|
| - request_id_to_cancel);
|
| - if (write) {
|
| - // The cancel will eventually send both the write failure and the cancel
|
| - // success.
|
| - write->Cancel(
|
| - base::Bind(&FileAndBlobMessageFilter::DidCancel, this, request_id));
|
| - } else {
|
| - // The write already finished; report that we failed to stop it.
|
| - Send(new FileSystemMsg_DidFail(
|
| - request_id, base::PLATFORM_FILE_ERROR_INVALID_OPERATION));
|
| - }
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnOpenFile(
|
| - int request_id, const GURL& path, int file_flags) {
|
| - base::PlatformFileError error;
|
| - const int open_permissions = base::PLATFORM_FILE_OPEN |
|
| - (file_flags & kOpenFilePermissions);
|
| - if (!HasPermissionsForFile(path, open_permissions, &error)) {
|
| - Send(new FileSystemMsg_DidFail(request_id, error));
|
| - return;
|
| - }
|
| -
|
| - GetNewOperation(path, request_id)->OpenFile(
|
| - path, file_flags, peer_handle(),
|
| - base::Bind(&FileAndBlobMessageFilter::DidOpenFile, this, request_id));
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnWillUpdate(const GURL& path) {
|
| - GURL origin_url;
|
| - fileapi::FileSystemType type;
|
| - if (!CrackFileSystemURL(path, &origin_url, &type, NULL))
|
| - return;
|
| - fileapi::FileSystemQuotaUtil* quota_util = context_->GetQuotaUtil(type);
|
| - if (!quota_util)
|
| - return;
|
| - quota_util->proxy()->StartUpdateOrigin(origin_url, type);
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnDidUpdate(const GURL& path, int64 delta) {
|
| - GURL origin_url;
|
| - fileapi::FileSystemType type;
|
| - if (!CrackFileSystemURL(path, &origin_url, &type, NULL))
|
| - return;
|
| - fileapi::FileSystemQuotaUtil* quota_util = context_->GetQuotaUtil(type);
|
| - if (!quota_util)
|
| - return;
|
| - quota_util->proxy()->UpdateOriginUsage(
|
| - context_->quota_manager_proxy(), origin_url, type, delta);
|
| - quota_util->proxy()->EndUpdateOrigin(origin_url, type);
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnSyncGetPlatformPath(
|
| - const GURL& path, FilePath* platform_path) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| - DCHECK(platform_path);
|
| - *platform_path = FilePath();
|
| -
|
| - GURL origin_url;
|
| - fileapi::FileSystemType file_system_type = fileapi::kFileSystemTypeUnknown;
|
| - FilePath file_path;
|
| - if (!fileapi::CrackFileSystemURL(
|
| - path, &origin_url, &file_system_type, &file_path)) {
|
| - return;
|
| - }
|
| -
|
| - // This is called only by pepper plugin as of writing to get the
|
| - // underlying platform path to upload a file in the sandboxed filesystem
|
| - // (e.g. TEMPORARY or PERSISTENT).
|
| - // TODO(kinuko): this hack should go away once appropriate upload-stream
|
| - // handling based on element types is supported.
|
| - FileSystemOperation* operation =
|
| - context_->CreateFileSystemOperation(
|
| - path,
|
| - BrowserThread::GetMessageLoopProxyForThread(
|
| - BrowserThread::FILE))->AsFileSystemOperation();
|
| - DCHECK(operation);
|
| - operation->SyncGetPlatformPath(path, platform_path);
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnCreateSnapshotFile(
|
| - int request_id, const GURL& blob_url, const GURL& path) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - GetNewOperation(path, request_id)->CreateSnapshotFile(
|
| - path,
|
| - base::Bind(&FileAndBlobMessageFilter::DidCreateSnapshot,
|
| - this, request_id, blob_url));
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnStartBuildingBlob(const GURL& url) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - blob_storage_context_->controller()->StartBuildingBlob(url);
|
| - blob_urls_.insert(url.spec());
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnAppendBlobDataItem(
|
| - const GURL& url, const BlobData::Item& item) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - if (item.type == BlobData::TYPE_FILE &&
|
| - !ChildProcessSecurityPolicyImpl::GetInstance()->CanReadFile(
|
| - process_id_, item.file_path)) {
|
| - OnRemoveBlob(url);
|
| - return;
|
| - }
|
| - blob_storage_context_->controller()->AppendBlobDataItem(url, item);
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnAppendSharedMemory(
|
| - const GURL& url, base::SharedMemoryHandle handle, size_t buffer_size) {
|
| - DCHECK(base::SharedMemory::IsHandleValid(handle));
|
| -#if defined(OS_WIN)
|
| - base::SharedMemory shared_memory(handle, true, peer_handle());
|
| -#else
|
| - base::SharedMemory shared_memory(handle, true);
|
| -#endif
|
| - if (!shared_memory.Map(buffer_size)) {
|
| - OnRemoveBlob(url);
|
| - return;
|
| - }
|
| -
|
| - BlobData::Item item;
|
| - item.SetToDataExternal(static_cast<char*>(shared_memory.memory()),
|
| - buffer_size);
|
| - blob_storage_context_->controller()->AppendBlobDataItem(url, item);
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnFinishBuildingBlob(
|
| - const GURL& url, const std::string& content_type) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - blob_storage_context_->controller()->FinishBuildingBlob(url, content_type);
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnCloneBlob(
|
| - const GURL& url, const GURL& src_url) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - blob_storage_context_->controller()->CloneBlob(url, src_url);
|
| - blob_urls_.insert(url.spec());
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::OnRemoveBlob(const GURL& url) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - blob_storage_context_->controller()->RemoveBlob(url);
|
| - blob_urls_.erase(url.spec());
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::DidFinish(int request_id,
|
| - base::PlatformFileError result) {
|
| - if (result == base::PLATFORM_FILE_OK)
|
| - Send(new FileSystemMsg_DidSucceed(request_id));
|
| - else
|
| - Send(new FileSystemMsg_DidFail(request_id, result));
|
| - UnregisterOperation(request_id);
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::DidCancel(int request_id,
|
| - base::PlatformFileError result) {
|
| - if (result == base::PLATFORM_FILE_OK)
|
| - Send(new FileSystemMsg_DidSucceed(request_id));
|
| - else
|
| - Send(new FileSystemMsg_DidFail(request_id, result));
|
| - // For Cancel we do not create a new operation, so no unregister here.
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::DidGetMetadata(
|
| - int request_id,
|
| - base::PlatformFileError result,
|
| - const base::PlatformFileInfo& info,
|
| - const FilePath& platform_path) {
|
| - if (result == base::PLATFORM_FILE_OK)
|
| - Send(new FileSystemMsg_DidReadMetadata(request_id, info, platform_path));
|
| - else
|
| - Send(new FileSystemMsg_DidFail(request_id, result));
|
| - UnregisterOperation(request_id);
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::DidReadDirectory(
|
| - int request_id,
|
| - base::PlatformFileError result,
|
| - const std::vector<base::FileUtilProxy::Entry>& entries,
|
| - bool has_more) {
|
| - if (result == base::PLATFORM_FILE_OK)
|
| - Send(new FileSystemMsg_DidReadDirectory(request_id, entries, has_more));
|
| - else
|
| - Send(new FileSystemMsg_DidFail(request_id, result));
|
| - UnregisterOperation(request_id);
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::DidOpenFile(int request_id,
|
| - base::PlatformFileError result,
|
| - base::PlatformFile file,
|
| - base::ProcessHandle peer_handle) {
|
| - if (result == base::PLATFORM_FILE_OK) {
|
| - IPC::PlatformFileForTransit file_for_transit =
|
| - file != base::kInvalidPlatformFileValue ?
|
| - IPC::GetFileHandleForProcess(file, peer_handle, true) :
|
| - IPC::InvalidPlatformFileForTransit();
|
| - Send(new FileSystemMsg_DidOpenFile(request_id, file_for_transit));
|
| - } else {
|
| - Send(new FileSystemMsg_DidFail(request_id, result));
|
| - }
|
| - UnregisterOperation(request_id);
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::DidWrite(int request_id,
|
| - base::PlatformFileError result,
|
| - int64 bytes,
|
| - bool complete) {
|
| - if (result == base::PLATFORM_FILE_OK) {
|
| - Send(new FileSystemMsg_DidWrite(request_id, bytes, complete));
|
| - if (complete)
|
| - UnregisterOperation(request_id);
|
| - } else {
|
| - Send(new FileSystemMsg_DidFail(request_id, result));
|
| - UnregisterOperation(request_id);
|
| - }
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::DidOpenFileSystem(int request_id,
|
| - base::PlatformFileError result,
|
| - const std::string& name,
|
| - const GURL& root) {
|
| - if (result == base::PLATFORM_FILE_OK) {
|
| - DCHECK(root.is_valid());
|
| - Send(new FileSystemMsg_DidOpenFileSystem(request_id, name, root));
|
| - } else {
|
| - Send(new FileSystemMsg_DidFail(request_id, result));
|
| - }
|
| - // For OpenFileSystem we do not create a new operation, so no unregister here.
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::DidCreateSnapshot(
|
| - int request_id,
|
| - const GURL& blob_url,
|
| - base::PlatformFileError result,
|
| - const base::PlatformFileInfo& info,
|
| - const FilePath& platform_path,
|
| - const scoped_refptr<webkit_blob::ShareableFileReference>& unused) {
|
| - if (result != base::PLATFORM_FILE_OK) {
|
| - Send(new FileSystemMsg_DidFail(request_id, result));
|
| - return;
|
| - }
|
| -
|
| - FilePath::StringType extension = platform_path.Extension();
|
| - if (!extension.empty())
|
| - extension = extension.substr(1); // Strip leading ".".
|
| -
|
| - // This may fail, but then we'll be just setting the empty mime type.
|
| - std::string mime_type;
|
| - net::GetWellKnownMimeTypeFromExtension(extension, &mime_type);
|
| -
|
| - // Register the created file to the blob registry.
|
| - // Blob storage automatically finds and refs the file_ref, so we don't
|
| - // need to do anything for the returned file reference (|unused|) here.
|
| - BlobData::Item item;
|
| - item.SetToFile(platform_path, 0, -1, base::Time());
|
| - BlobStorageController* controller = blob_storage_context_->controller();
|
| - controller->StartBuildingBlob(blob_url);
|
| - controller->AppendBlobDataItem(blob_url, item);
|
| - controller->FinishBuildingBlob(blob_url, mime_type);
|
| - blob_urls_.insert(blob_url.spec());
|
| -
|
| - // Return the file info and platform_path.
|
| - Send(new FileSystemMsg_DidReadMetadata(request_id, info, platform_path));
|
| -}
|
| -
|
| -bool FileAndBlobMessageFilter::HasPermissionsForFile(
|
| - const GURL& path, int permissions, base::PlatformFileError* error) {
|
| - DCHECK(error);
|
| - *error = base::PLATFORM_FILE_OK;
|
| -
|
| - GURL origin;
|
| - fileapi::FileSystemType file_system_type = fileapi::kFileSystemTypeUnknown;
|
| - FilePath virtual_path;
|
| - // TODO(tbarzic): try to reduce number of calls to CrackFileSystemURL.
|
| - if (!fileapi::CrackFileSystemURL(path, &origin, &file_system_type,
|
| - &virtual_path)) {
|
| - *error = base::PLATFORM_FILE_ERROR_INVALID_URL;
|
| - return false;
|
| - }
|
| -
|
| - FileSystemMountPointProvider* mount_point_provider =
|
| - context_->GetMountPointProvider(file_system_type);
|
| - if (!mount_point_provider) {
|
| - *error = base::PLATFORM_FILE_ERROR_INVALID_URL;
|
| - return false;
|
| - }
|
| -
|
| - FilePath file_path =
|
| - mount_point_provider->GetPathForPermissionsCheck(virtual_path);
|
| - if (file_path.empty()) {
|
| - *error = base::PLATFORM_FILE_ERROR_SECURITY;
|
| - return false;
|
| - }
|
| -
|
| - bool success =
|
| - ChildProcessSecurityPolicyImpl::GetInstance()->HasPermissionsForFile(
|
| - process_id_, file_path, permissions);
|
| - if (!success)
|
| - *error = base::PLATFORM_FILE_ERROR_SECURITY;
|
| - return success;
|
| -}
|
| -
|
| -
|
| -FileSystemOperationInterface* FileAndBlobMessageFilter::GetNewOperation(
|
| - const GURL& target_path,
|
| - int request_id) {
|
| - FileSystemOperationInterface* operation =
|
| - context_->CreateFileSystemOperation(
|
| - target_path,
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE));
|
| - DCHECK(operation);
|
| - operations_.AddWithID(operation, request_id);
|
| - return operation;
|
| -}
|
| -
|
| -void FileAndBlobMessageFilter::UnregisterOperation(int request_id) {
|
| - DCHECK(operations_.Lookup(request_id));
|
| - operations_.Remove(request_id);
|
| -}
|
|
|