| Index: chrome/browser/renderer_host/file_utilities_message_filter.cc
|
| ===================================================================
|
| --- chrome/browser/renderer_host/file_utilities_message_filter.cc (revision 68877)
|
| +++ chrome/browser/renderer_host/file_utilities_message_filter.cc (working copy)
|
| @@ -2,160 +2,89 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "chrome/browser/renderer_host/file_utilities_dispatcher_host.h"
|
| +#include "chrome/browser/renderer_host/file_utilities_message_filter.h"
|
|
|
| #include "base/file_util.h"
|
| -#include "base/platform_file.h"
|
| #include "chrome/browser/child_process_security_policy.h"
|
| -#include "chrome/browser/browser_thread.h"
|
| -#include "chrome/common/render_messages.h"
|
| -#include "chrome/common/render_messages_params.h"
|
| +#include "chrome/common/file_utilities_messages.h"
|
|
|
| -namespace {
|
|
|
| -void WriteFileSize(IPC::Message* reply_msg,
|
| - const base::PlatformFileInfo& file_info) {
|
| - ViewHostMsg_GetFileSize::WriteReplyParams(reply_msg, file_info.size);
|
| +FileUtilitiesMessageFilter::FileUtilitiesMessageFilter(int process_id)
|
| + : process_id_(process_id) {
|
| }
|
|
|
| -void WriteFileModificationTime(IPC::Message* reply_msg,
|
| - const base::PlatformFileInfo& file_info) {
|
| - ViewHostMsg_GetFileModificationTime::WriteReplyParams(
|
| - reply_msg, file_info.last_modified);
|
| +FileUtilitiesMessageFilter::~FileUtilitiesMessageFilter() {
|
| }
|
|
|
| -} // namespace
|
| -
|
| -FileUtilitiesDispatcherHost::FileUtilitiesDispatcherHost(
|
| - IPC::Message::Sender* sender, int process_id)
|
| - : message_sender_(sender),
|
| - process_id_(process_id),
|
| - process_handle_(0),
|
| - shutdown_(false) {
|
| - DCHECK(message_sender_);
|
| +void FileUtilitiesMessageFilter::OverrideThreadForMessage(
|
| + const IPC::Message& message,
|
| + BrowserThread::ID* thread) {
|
| + if (IPC_MESSAGE_CLASS(message) == FileUtilitiesMsgStart)
|
| + *thread = BrowserThread::FILE;
|
| }
|
|
|
| -FileUtilitiesDispatcherHost::~FileUtilitiesDispatcherHost() {
|
| -}
|
| -
|
| -void FileUtilitiesDispatcherHost::Init(base::ProcessHandle process_handle) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - DCHECK(!shutdown_);
|
| - DCHECK(!process_handle_);
|
| - DCHECK(process_handle);
|
| - process_handle_ = process_handle;
|
| -}
|
| -
|
| -void FileUtilitiesDispatcherHost::Shutdown() {
|
| - message_sender_ = NULL;
|
| - shutdown_ = true;
|
| -}
|
| -
|
| -bool FileUtilitiesDispatcherHost::OnMessageReceived(
|
| - const IPC::Message& message) {
|
| - DCHECK(!shutdown_);
|
| +bool FileUtilitiesMessageFilter::OnMessageReceived(const IPC::Message& message,
|
| + bool* message_was_ok) {
|
| bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP(FileUtilitiesDispatcherHost, message)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetFileSize, OnGetFileSize)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetFileModificationTime,
|
| - OnGetFileModificationTime)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_OpenFile, OnOpenFile)
|
| - IPC_MESSAGE_UNHANDLED((handled = false))
|
| + IPC_BEGIN_MESSAGE_MAP_EX(FileUtilitiesMessageFilter, message, *message_was_ok)
|
| + IPC_MESSAGE_HANDLER(FileUtilitiesMsg_GetFileSize, OnGetFileSize)
|
| + IPC_MESSAGE_HANDLER(FileUtilitiesMsg_GetFileModificationTime,
|
| + OnGetFileModificationTime)
|
| + IPC_MESSAGE_HANDLER(FileUtilitiesMsg_OpenFile, OnOpenFile)
|
| + IPC_MESSAGE_UNHANDLED(handled = false)
|
| IPC_END_MESSAGE_MAP()
|
| return handled;
|
| }
|
|
|
| -void FileUtilitiesDispatcherHost::OnGetFileSize(
|
| - const FilePath& path, IPC::Message* reply_msg) {
|
| +void FileUtilitiesMessageFilter::OnGetFileSize(const FilePath& path,
|
| + int64* result) {
|
| // Get file size only when the child process has been granted permission to
|
| // upload the file.
|
| if (!ChildProcessSecurityPolicy::GetInstance()->CanReadFile(
|
| process_id_, path)) {
|
| - ViewHostMsg_GetFileSize::WriteReplyParams(
|
| - reply_msg, static_cast<int64>(-1));
|
| - Send(reply_msg);
|
| + *result = -1;
|
| return;
|
| }
|
|
|
| - // Getting file size could take long time if it lives on a network share,
|
| - // so run it on FILE thread.
|
| - BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE,
|
| - NewRunnableMethod(
|
| - this, &FileUtilitiesDispatcherHost::OnGetFileInfoOnFileThread, path,
|
| - reply_msg, &WriteFileSize));
|
| + base::PlatformFileInfo file_info;
|
| + file_info.size = 0;
|
| + file_util::GetFileInfo(path, &file_info);
|
| + *result = file_info.size;
|
| }
|
|
|
| -void FileUtilitiesDispatcherHost::OnGetFileModificationTime(
|
| - const FilePath& path, IPC::Message* reply_msg) {
|
| +void FileUtilitiesMessageFilter::OnGetFileModificationTime(
|
| + const FilePath& path, base::Time* result) {
|
| // Get file modification time only when the child process has been granted
|
| // permission to upload the file.
|
| if (!ChildProcessSecurityPolicy::GetInstance()->CanReadFile(
|
| process_id_, path)) {
|
| - ViewHostMsg_GetFileModificationTime::WriteReplyParams(reply_msg,
|
| - base::Time());
|
| - Send(reply_msg);
|
| + *result = base::Time();
|
| return;
|
| }
|
|
|
| - // Getting file modification time could take a long time if it lives on a
|
| - // network share, so run it on the FILE thread.
|
| - BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE,
|
| - NewRunnableMethod(
|
| - this, &FileUtilitiesDispatcherHost::OnGetFileInfoOnFileThread,
|
| - path, reply_msg, &WriteFileModificationTime));
|
| -}
|
| -
|
| -void FileUtilitiesDispatcherHost::OnGetFileInfoOnFileThread(
|
| - const FilePath& path,
|
| - IPC::Message* reply_msg,
|
| - FileInfoWriteFunc write_func) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| -
|
| base::PlatformFileInfo file_info;
|
| file_info.size = 0;
|
| file_util::GetFileInfo(path, &file_info);
|
| -
|
| - (*write_func)(reply_msg, file_info);
|
| -
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - NewRunnableMethod(this, &FileUtilitiesDispatcherHost::Send, reply_msg));
|
| + *result = file_info.last_modified;
|
| }
|
|
|
| -void FileUtilitiesDispatcherHost::OnOpenFile(
|
| - const FilePath& path, int mode, IPC::Message* reply_msg) {
|
| +void FileUtilitiesMessageFilter::OnOpenFile(
|
| + const FilePath& path,
|
| + int mode,
|
| + IPC::PlatformFileForTransit* result) {
|
| // Open the file only when the child process has been granted permission to
|
| // upload the file.
|
| // TODO(jianli): Do we need separate permission to control opening the file?
|
| if (!ChildProcessSecurityPolicy::GetInstance()->CanReadFile(
|
| - process_id_, path)) {
|
| - ViewHostMsg_OpenFile::WriteReplyParams(
|
| - reply_msg,
|
| + process_id_, path)) {
|
| #if defined(OS_WIN)
|
| - base::kInvalidPlatformFileValue
|
| + *result = base::kInvalidPlatformFileValue;
|
| #elif defined(OS_POSIX)
|
| - base::FileDescriptor(base::kInvalidPlatformFileValue, true)
|
| + *result = base::FileDescriptor(base::kInvalidPlatformFileValue, true);
|
| #endif
|
| - );
|
| - Send(reply_msg);
|
| return;
|
| }
|
|
|
| - // Opening the file could take a long time if it lives on a network share,
|
| - // so run it on the FILE thread.
|
| - BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE,
|
| - NewRunnableMethod(
|
| - this, &FileUtilitiesDispatcherHost::OnOpenFileOnFileThread,
|
| - path, mode, reply_msg));
|
| -}
|
| -
|
| -void FileUtilitiesDispatcherHost::OnOpenFileOnFileThread(
|
| - const FilePath& path, int mode, IPC::Message* reply_msg) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| -
|
| base::PlatformFile file_handle = base::CreatePlatformFile(
|
| path,
|
| (mode == 0) ? (base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ)
|
| @@ -163,37 +92,15 @@
|
| base::PLATFORM_FILE_WRITE),
|
| NULL, NULL);
|
|
|
| - base::PlatformFile target_file_handle;
|
| #if defined(OS_WIN)
|
| // Duplicate the file handle so that the renderer process can access the file.
|
| if (!DuplicateHandle(GetCurrentProcess(), file_handle,
|
| - process_handle_, &target_file_handle, 0, false,
|
| + peer_handle(), result, 0, false,
|
| DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
|
| // file_handle is closed whether or not DuplicateHandle succeeds.
|
| - target_file_handle = INVALID_HANDLE_VALUE;
|
| + *result = INVALID_HANDLE_VALUE;
|
| }
|
| #else
|
| - target_file_handle = file_handle;
|
| + *result = base::FileDescriptor(file_handle, true);
|
| #endif
|
| -
|
| - ViewHostMsg_OpenFile::WriteReplyParams(
|
| - reply_msg,
|
| -#if defined(OS_WIN)
|
| - target_file_handle
|
| -#elif defined(OS_POSIX)
|
| - base::FileDescriptor(target_file_handle, true)
|
| -#endif
|
| - );
|
| -
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - NewRunnableMethod(this, &FileUtilitiesDispatcherHost::Send, reply_msg));
|
| }
|
| -
|
| -void FileUtilitiesDispatcherHost::Send(IPC::Message* message) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - if (!shutdown_ && message_sender_)
|
| - message_sender_->Send(message);
|
| - else
|
| - delete message;
|
| -}
|
|
|