pepper_file_io_host.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
10f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 20f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 30f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// found in the LICENSE file. 40f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 50f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_file_io_host.h" 60f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 70f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/bind.h" 80f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/callback.h" 90f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/callback_helpers.h" 100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/files/file_util_proxy.h" 110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/memory/weak_ptr.h" 120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_file_ref_host.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_file_system_browser_host.h" 140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_security_helper.h" 150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/common/fileapi/file_system_messages.h" 160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/common/sandbox_util.h" 170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/common/view_messages.h" 180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/public/browser/storage_partition.h" 220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/public/common/content_client.h" 230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ppapi/c/pp_errors.h" 240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ppapi/c/ppb_file_io.h" 250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ppapi/host/dispatch_host_message.h" 260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ppapi/host/ppapi_host.h" 270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ppapi/shared_impl/file_system_util.h" 290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ppapi/shared_impl/file_type_conversion.h" 300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ppapi/shared_impl/time_conversion.h" 310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "webkit/browser/fileapi/file_observers.h" 320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_context.h" 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_operation_runner.h" 340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "webkit/browser/fileapi/task_runner_bound_observer_list.h" 350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "webkit/common/fileapi/file_system_util.h" 360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)namespace content { 380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)using ppapi::FileIOStateManager; 400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)using ppapi::PPTimeToTime; 410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)namespace { 430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)PepperFileIOHost::UIThreadStuff 450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)GetUIThreadStuffForInternalFileSystems(int render_process_id) { 460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PepperFileIOHost::UIThreadStuff stuff; 470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) RenderProcessHost* host = RenderProcessHost::FromID(render_process_id); 490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (host) { 500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) stuff.resolved_render_process_id = base::GetProcId(host->GetHandle()); 510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) StoragePartition* storage_partition = host->GetStoragePartition(); 520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (storage_partition) 530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) stuff.file_system_context = storage_partition->GetFileSystemContext(); 540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return stuff; 560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)base::ProcessId GetResolvedRenderProcessId(int render_process_id) { 590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) RenderProcessHost* host = RenderProcessHost::FromID(render_process_id); 610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!host) 620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return base::kNullProcessId; 630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return base::GetProcId(host->GetHandle()); 640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)bool GetPluginAllowedToCallRequestOSFileHandle(int render_process_id, 670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const GURL& document_url) { 680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ContentBrowserClient* client = GetContentClient()->browser(); 700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) RenderProcessHost* host = RenderProcessHost::FromID(render_process_id); 710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return client->IsPluginAllowedToCallRequestOSFileHandle( 720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) host->GetBrowserContext(), document_url); 730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool FileOpenForWrite(int32_t open_flags) { 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return (open_flags & (PP_FILEOPENFLAG_WRITE | PP_FILEOPENFLAG_APPEND)) != 0; 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} // namespace 800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)PepperFileIOHost::PepperFileIOHost(BrowserPpapiHostImpl* host, 820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PP_Instance instance, 830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PP_Resource resource) 840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) : ResourceHost(host->GetPpapiHost(), instance, resource), 850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) browser_ppapi_host_(host), 860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) render_process_host_(NULL), 870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_(base::kInvalidPlatformFileValue), 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) open_flags_(0), 890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_system_type_(PP_FILESYSTEMTYPE_INVALID), 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) max_written_offset_(0), 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) check_quota_(false), 920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) weak_factory_(this) { 930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int unused; 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!host->GetRenderFrameIDsForInstance(instance, 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &render_process_id_, 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &unused)) { 970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) render_process_id_ = -1; 980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_message_loop_ = BrowserThread::GetMessageLoopProxyForThread( 1000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserThread::FILE); 1010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 1020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)PepperFileIOHost::~PepperFileIOHost() { 1040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 1050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)int32_t PepperFileIOHost::OnResourceMessageReceived( 1070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const IPC::Message& msg, 1080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ppapi::host::HostMessageContext* context) { 1090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(PepperFileIOHost, msg) 1100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_FileIO_Open, 1110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) OnHostMsgOpen) 1120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_FileIO_Touch, 1130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) OnHostMsgTouch) 1140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_FileIO_SetLength, 1150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) OnHostMsgSetLength) 1160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_FileIO_Flush, 1170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) OnHostMsgFlush) 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_FileIO_Close, 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnHostMsgClose) 1200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_FileIO_RequestOSFileHandle, 1210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) OnHostMsgRequestOSFileHandle) 1220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IPC_END_MESSAGE_MAP() 1230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PP_ERROR_FAILED; 1240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 1250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)PepperFileIOHost::UIThreadStuff::UIThreadStuff() { 1270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) resolved_render_process_id = base::kNullProcessId; 1280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 1290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)PepperFileIOHost::UIThreadStuff::~UIThreadStuff() { 1310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 1320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)int32_t PepperFileIOHost::OnHostMsgOpen( 1340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ppapi::host::HostMessageContext* context, 1350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PP_Resource file_ref_resource, 1360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int32_t open_flags) { 1370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int32_t rv = state_manager_.CheckOperationState( 1380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FileIOStateManager::OPERATION_EXCLUSIVE, false); 1390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (rv != PP_OK) 1400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return rv; 1410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int platform_file_flags = 0; 1430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!ppapi::PepperFileOpenFlagsToPlatformFileFlags(open_flags, 1440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) &platform_file_flags)) 1450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PP_ERROR_BADARGUMENT; 1460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ppapi::host::ResourceHost* resource_host = 1480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) host()->GetResourceHost(file_ref_resource); 1490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!resource_host || !resource_host->IsFileRefHost()) 1500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PP_ERROR_BADRESOURCE; 1510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PepperFileRefHost* file_ref_host = 1520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) static_cast<PepperFileRefHost*>(resource_host); 1530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (file_ref_host->GetFileSystemType() == PP_FILESYSTEMTYPE_INVALID) 1540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PP_ERROR_FAILED; 1550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) file_system_host_ = file_ref_host->GetFileSystemHost(); 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) open_flags_ = open_flags; 1590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_system_type_ = file_ref_host->GetFileSystemType(); 1600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_system_url_ = file_ref_host->GetFileSystemURL(); 1610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (file_system_type_ != PP_FILESYSTEMTYPE_EXTERNAL) { 1630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!file_system_url_.is_valid()) 1640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PP_ERROR_BADARGUMENT; 1650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!CanOpenFileSystemURLWithPepperFlags(open_flags, 1660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) render_process_id_, 1670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_system_url_)) 1680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PP_ERROR_NOACCESS; 1690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserThread::PostTaskAndReplyWithResult( 1700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserThread::UI, 1710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FROM_HERE, 1720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind(&GetUIThreadStuffForInternalFileSystems, 1730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) render_process_id_), 1740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind(&PepperFileIOHost::GotUIThreadStuffForInternalFileSystems, 1750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) weak_factory_.GetWeakPtr(), 1760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) context->MakeReplyMessageContext(), 1770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) platform_file_flags)); 1780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } else { 1790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::FilePath path = file_ref_host->GetExternalFilePath(); 1800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!CanOpenWithPepperFlags(open_flags, render_process_id_, path)) 1810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PP_ERROR_NOACCESS; 1820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserThread::PostTaskAndReplyWithResult( 1830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserThread::UI, 1840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FROM_HERE, 1850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind(&GetResolvedRenderProcessId, render_process_id_), 1860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind(&PepperFileIOHost::GotResolvedRenderProcessId, 1870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) weak_factory_.GetWeakPtr(), 1880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) context->MakeReplyMessageContext(), 1890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) path, 1900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) platform_file_flags)); 1910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 1920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE); 1930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 1940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 1950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void PepperFileIOHost::GotUIThreadStuffForInternalFileSystems( 1970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context, 1980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int platform_file_flags, 1990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) UIThreadStuff ui_thread_stuff) { 2000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 2010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_system_context_ = ui_thread_stuff.file_system_context; 2020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) resolved_render_process_id_ = ui_thread_stuff.resolved_render_process_id; 2030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (resolved_render_process_id_ == base::kNullProcessId || 2040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) !file_system_context_.get()) { 2050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) reply_context.params.set_result(PP_ERROR_FAILED); 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SendOpenErrorReply(reply_context); 2070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return; 2080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 2090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!file_system_context_->GetFileSystemBackend(file_system_url_.type())) { 2110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) reply_context.params.set_result(PP_ERROR_FAILED); 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SendOpenErrorReply(reply_context); 2130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return; 2140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(file_system_host_.get()); 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(file_system_host_->GetFileSystemOperationRunner()); 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) file_system_host_->GetFileSystemOperationRunner()->OpenFile( 2190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_system_url_, 2200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) platform_file_flags, 2210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind(&PepperFileIOHost::DidOpenInternalFile, 2220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) weak_factory_.GetWeakPtr(), 2230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) reply_context)); 2240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 2250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void PepperFileIOHost::DidOpenInternalFile( 2270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context, 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error result, 2290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::PlatformFile file, 2300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const base::Closure& on_close_callback) { 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (result == base::File::FILE_OK) { 2320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) on_close_callback_ = on_close_callback; 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (FileOpenForWrite(open_flags_) && file_system_host_->ChecksQuota()) { 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) check_quota_ = true; 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) file_system_host_->OpenQuotaFile( 237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) this, 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_system_url_, 239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&PepperFileIOHost::DidOpenQuotaFile, 240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) weak_factory_.GetWeakPtr(), 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) reply_context, 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) file)); 243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ExecutePlatformOpenFileCallback( 2480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) reply_context, result, base::PassPlatformFile(&file), true); 2490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 2500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void PepperFileIOHost::GotResolvedRenderProcessId( 2520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context, 2530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::FilePath path, 2540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int platform_file_flags, 2550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::ProcessId resolved_render_process_id) { 2560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 2570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) resolved_render_process_id_ = resolved_render_process_id; 2580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::FileUtilProxy::CreateOrOpen( 2590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_message_loop_, 2600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) path, 2610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) platform_file_flags, 2620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind(&PepperFileIOHost::ExecutePlatformOpenFileCallback, 2630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) weak_factory_.GetWeakPtr(), 2640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) reply_context)); 2650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 2660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)int32_t PepperFileIOHost::OnHostMsgTouch( 2680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ppapi::host::HostMessageContext* context, 2690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PP_Time last_access_time, 2700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PP_Time last_modified_time) { 2710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int32_t rv = state_manager_.CheckOperationState( 2720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FileIOStateManager::OPERATION_EXCLUSIVE, true); 2730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (rv != PP_OK) 2740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return rv; 2750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!base::FileUtilProxy::Touch( 277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) file_message_loop_, 278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) file_, 279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PPTimeToTime(last_access_time), 280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PPTimeToTime(last_modified_time), 281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&PepperFileIOHost::ExecutePlatformGeneralCallback, 282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_factory_.GetWeakPtr(), 283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) context->MakeReplyMessageContext()))) 284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return PP_ERROR_FAILED; 2850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE); 2870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 2880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 2890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)int32_t PepperFileIOHost::OnHostMsgSetLength( 2910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ppapi::host::HostMessageContext* context, 2920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int64_t length) { 2930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int32_t rv = state_manager_.CheckOperationState( 2940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FileIOStateManager::OPERATION_EXCLUSIVE, true); 2950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (rv != PP_OK) 2960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return rv; 297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (length < 0) 298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return PP_ERROR_BADARGUMENT; 2990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Quota checks are performed on the plugin side, in order to use the same 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // quota reservation and request system as Write. 3020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!base::FileUtilProxy::Truncate( 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_message_loop_, 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_, 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) length, 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&PepperFileIOHost::ExecutePlatformGeneralCallback, 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) weak_factory_.GetWeakPtr(), 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context->MakeReplyMessageContext()))) 310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return PP_ERROR_FAILED; 311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE); 3130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 3140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 3150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)int32_t PepperFileIOHost::OnHostMsgFlush( 3170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ppapi::host::HostMessageContext* context) { 3180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int32_t rv = state_manager_.CheckOperationState( 3190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FileIOStateManager::OPERATION_EXCLUSIVE, true); 3200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (rv != PP_OK) 3210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return rv; 3220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!base::FileUtilProxy::Flush( 3240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_message_loop_, 3250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_, 3260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind(&PepperFileIOHost::ExecutePlatformGeneralCallback, 3270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) weak_factory_.GetWeakPtr(), 3280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) context->MakeReplyMessageContext()))) 3290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PP_ERROR_FAILED; 3300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE); 3320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 3330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 3340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)int32_t PepperFileIOHost::OnHostMsgClose( 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ppapi::host::HostMessageContext* context, 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ppapi::FileGrowth& file_growth) { 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (check_quota_) { 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_system_host_->CloseQuotaFile(this, file_growth); 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) check_quota_ = false; 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (file_ != base::kInvalidPlatformFileValue) { 3440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::FileUtilProxy::Close( 3450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_message_loop_, 3460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_, 3470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind(&PepperFileIOHost::DidCloseFile, 3480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) weak_factory_.GetWeakPtr())); 3490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_ = base::kInvalidPlatformFileValue; 3500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 3510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PP_OK; 3520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 3530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PepperFileIOHost::DidOpenQuotaFile( 355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context, 356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::PlatformFile file, 357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int64_t max_written_offset) { 358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) max_written_offset_ = max_written_offset; 359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExecutePlatformOpenFileCallback( 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reply_context, base::File::FILE_OK, base::PassPlatformFile(&file), 362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) true); 363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PepperFileIOHost::DidCloseFile(base::File::Error error) { 3660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Silently ignore if we fail to close the file. 3670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!on_close_callback_.is_null()) { 3680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) on_close_callback_.Run(); 3690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) on_close_callback_.Reset(); 3700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 3710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 3720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)int32_t PepperFileIOHost::OnHostMsgRequestOSFileHandle( 3740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ppapi::host::HostMessageContext* context) { 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (open_flags_ != PP_FILEOPENFLAG_READ && file_system_host_->ChecksQuota()) 3760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PP_ERROR_FAILED; 3770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) GURL document_url = 3790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) browser_ppapi_host_->GetDocumentURLForInstance(pp_instance()); 3800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserThread::PostTaskAndReplyWithResult( 3810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserThread::UI, 3820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FROM_HERE, 3830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind(&GetPluginAllowedToCallRequestOSFileHandle, 3840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) render_process_id_, 3850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) document_url), 3860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Bind(&PepperFileIOHost::GotPluginAllowedToCallRequestOSFileHandle, 3870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) weak_factory_.GetWeakPtr(), 3880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) context->MakeReplyMessageContext())); 3890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 3900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 3910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void PepperFileIOHost::GotPluginAllowedToCallRequestOSFileHandle( 3930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context, 3940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool plugin_allowed) { 3950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 3960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!browser_ppapi_host_->external_plugin() || 3970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) host()->permissions().HasPermission(ppapi::PERMISSION_PRIVATE) || 3980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) plugin_allowed) { 3990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!AddFileToReplyContext(open_flags_, &reply_context)) 4000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) reply_context.params.set_result(PP_ERROR_FAILED); 4010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } else { 4020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) reply_context.params.set_result(PP_ERROR_NOACCESS); 4030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 4040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) host()->SendReply(reply_context, 4050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PpapiPluginMsg_FileIO_RequestOSFileHandleReply()); 4060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 4070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 4080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void PepperFileIOHost::ExecutePlatformGeneralCallback( 4090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context, 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error_code) { 4110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) reply_context.params.set_result( 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ppapi::FileErrorToPepperError(error_code)); 4130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) host()->SendReply(reply_context, PpapiPluginMsg_FileIO_GeneralReply()); 4140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) state_manager_.SetOperationFinished(); 4150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 4160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 4170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void PepperFileIOHost::ExecutePlatformOpenFileCallback( 4180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context, 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error_code, 4200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::PassPlatformFile file, 4210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool unused_created) { 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32_t pp_error = ppapi::FileErrorToPepperError(error_code); 4230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DCHECK(file_ == base::kInvalidPlatformFileValue); 4240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_ = file.ReleaseValue(); 4250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (file_ != base::kInvalidPlatformFileValue && 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !AddFileToReplyContext(open_flags_, &reply_context)) 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pp_error = PP_ERROR_FAILED; 4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PP_Resource quota_file_system = 0; 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (pp_error == PP_OK) { 4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) state_manager_.SetOpenSucceed(); 4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A non-zero resource id signals the plugin side to check quota. 4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (check_quota_) 4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) quota_file_system = file_system_host_->pp_resource(); 4360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) reply_context.params.set_result(pp_error); 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host()->SendReply(reply_context, 4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PpapiPluginMsg_FileIO_OpenReply(quota_file_system, 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) max_written_offset_)); 4420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) state_manager_.SetOperationFinished(); 4430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 4440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PepperFileIOHost::SendOpenErrorReply( 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context) { 4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host()->SendReply(reply_context, PpapiPluginMsg_FileIO_OpenReply(0, 0)); 4480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 4490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 4500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)bool PepperFileIOHost::AddFileToReplyContext( 4510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int32_t open_flags, 4520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ppapi::host::ReplyMessageContext* reply_context) const { 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ProcessId plugin_process_id = 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::GetProcId(browser_ppapi_host_->GetPluginProcessHandle()); 4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (plugin_process_id == base::kNullProcessId) 4560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) plugin_process_id = resolved_render_process_id_; 4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IPC::PlatformFileForTransit transit_file = BrokerGetFileHandleForProcess( 4590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_, plugin_process_id, false); 4600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (transit_file == IPC::InvalidPlatformFileForTransit()) 4610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return false; 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ppapi::proxy::SerializedHandle file_handle; 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A non-zero resource id signals NaClIPCAdapter to create a NaClQuotaDesc. 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PP_Resource quota_file_io = check_quota_ ? pp_resource() : 0; 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_handle.set_file_handle(transit_file, open_flags, quota_file_io); 4670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) reply_context->params.AppendHandle(file_handle); 4680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return true; 4690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 4700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 4710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} // namespace content 472