1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CONTENT_RENDERER_PEPPER_PEPPER_FILE_IO_HOST_H_ 6#define CONTENT_RENDERER_PEPPER_PEPPER_FILE_IO_HOST_H_ 7 8#include <string> 9 10#include "base/basictypes.h" 11#include "base/callback_forward.h" 12#include "base/files/file.h" 13#include "base/files/file_proxy.h" 14#include "base/memory/weak_ptr.h" 15#include "content/browser/renderer_host/pepper/browser_ppapi_host_impl.h" 16#include "ipc/ipc_listener.h" 17#include "ipc/ipc_platform_file.h" 18#include "ppapi/c/pp_file_info.h" 19#include "ppapi/c/pp_time.h" 20#include "ppapi/host/host_message_context.h" 21#include "ppapi/host/resource_host.h" 22#include "ppapi/shared_impl/file_io_state_manager.h" 23#include "storage/browser/fileapi/file_system_context.h" 24#include "url/gurl.h" 25 26namespace ppapi { 27struct FileGrowth; 28} 29 30namespace content { 31class PepperFileSystemBrowserHost; 32 33class PepperFileIOHost : public ppapi::host::ResourceHost, 34 public base::SupportsWeakPtr<PepperFileIOHost> { 35 public: 36 typedef base::Callback<void(base::File::Error)> NotifyCloseFileCallback; 37 38 PepperFileIOHost(BrowserPpapiHostImpl* host, 39 PP_Instance instance, 40 PP_Resource resource); 41 virtual ~PepperFileIOHost(); 42 43 // ppapi::host::ResourceHost override. 44 virtual int32_t OnResourceMessageReceived( 45 const IPC::Message& msg, 46 ppapi::host::HostMessageContext* context) OVERRIDE; 47 48 struct UIThreadStuff { 49 UIThreadStuff(); 50 ~UIThreadStuff(); 51 base::ProcessId resolved_render_process_id; 52 scoped_refptr<storage::FileSystemContext> file_system_context; 53 }; 54 55 private: 56 int32_t OnHostMsgOpen(ppapi::host::HostMessageContext* context, 57 PP_Resource file_ref_resource, 58 int32_t open_flags); 59 int32_t OnHostMsgTouch(ppapi::host::HostMessageContext* context, 60 PP_Time last_access_time, 61 PP_Time last_modified_time); 62 int32_t OnHostMsgSetLength(ppapi::host::HostMessageContext* context, 63 int64_t length); 64 int32_t OnHostMsgClose(ppapi::host::HostMessageContext* context, 65 const ppapi::FileGrowth& file_growth); 66 int32_t OnHostMsgFlush(ppapi::host::HostMessageContext* context); 67 int32_t OnHostMsgRequestOSFileHandle( 68 ppapi::host::HostMessageContext* context); 69 70 void GotPluginAllowedToCallRequestOSFileHandle( 71 ppapi::host::ReplyMessageContext reply_context, 72 bool plugin_allowed); 73 74 // Callback handlers. These mostly convert the File::Error to the 75 // PP_Error code and send back the reply. Note that the argument 76 // ReplyMessageContext is copied so that we have a closure containing all 77 // necessary information to reply. 78 void ExecutePlatformGeneralCallback( 79 ppapi::host::ReplyMessageContext reply_context, 80 base::File::Error error_code); 81 82 void OnOpenProxyCallback(ppapi::host::ReplyMessageContext reply_context, 83 base::File::Error error_code); 84 85 void GotUIThreadStuffForInternalFileSystems( 86 ppapi::host::ReplyMessageContext reply_context, 87 int platform_file_flags, 88 UIThreadStuff ui_thread_stuff); 89 void DidOpenInternalFile(ppapi::host::ReplyMessageContext reply_context, 90 base::File file, 91 const base::Closure& on_close_callback); 92 void GotResolvedRenderProcessId( 93 ppapi::host::ReplyMessageContext reply_context, 94 base::FilePath path, 95 int file_flags, 96 base::ProcessId resolved_render_process_id); 97 98 void DidOpenQuotaFile(ppapi::host::ReplyMessageContext reply_context, 99 base::File file, 100 int64_t max_written_offset); 101 bool CallSetLength(ppapi::host::ReplyMessageContext reply_context, 102 int64_t length); 103 104 void DidCloseFile(base::File::Error error); 105 106 void SendOpenErrorReply(ppapi::host::ReplyMessageContext reply_context); 107 108 // Adds file_ to |reply_context| with the specified |open_flags|. 109 bool AddFileToReplyContext( 110 int32_t open_flags, 111 ppapi::host::ReplyMessageContext* reply_context) const; 112 113 BrowserPpapiHostImpl* browser_ppapi_host_; 114 115 RenderProcessHost* render_process_host_; 116 int render_process_id_; 117 base::ProcessId resolved_render_process_id_; 118 119 base::FileProxy file_; 120 int32_t open_flags_; 121 122 // The file system type specified in the Open() call. This will be 123 // PP_FILESYSTEMTYPE_INVALID before open was called. This value does not 124 // indicate that the open command actually succeeded. 125 PP_FileSystemType file_system_type_; 126 base::WeakPtr<PepperFileSystemBrowserHost> file_system_host_; 127 128 // Valid only for PP_FILESYSTEMTYPE_LOCAL{PERSISTENT,TEMPORARY}. 129 scoped_refptr<storage::FileSystemContext> file_system_context_; 130 storage::FileSystemURL file_system_url_; 131 base::Closure on_close_callback_; 132 int64_t max_written_offset_; 133 bool check_quota_; 134 135 ppapi::FileIOStateManager state_manager_; 136 137 DISALLOW_COPY_AND_ASSIGN(PepperFileIOHost); 138}; 139 140} // namespace content 141 142#endif // CONTENT_RENDERER_PEPPER_PEPPER_FILE_IO_HOST_H_ 143