file_system_resource.cc revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
1// Copyright (c) 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#include "ppapi/proxy/file_system_resource.h" 6 7#include "base/bind.h" 8#include "ipc/ipc_message.h" 9#include "ppapi/c/pp_errors.h" 10#include "ppapi/proxy/ppapi_messages.h" 11#include "ppapi/shared_impl/tracked_callback.h" 12 13using ppapi::thunk::PPB_FileSystem_API; 14 15namespace ppapi { 16namespace proxy { 17 18FileSystemResource::FileSystemResource(Connection connection, 19 PP_Instance instance, 20 PP_FileSystemType type) 21 : PluginResource(connection, instance), 22 type_(type), 23 called_open_(false), 24 callback_count_(0) { 25 DCHECK(type_ != PP_FILESYSTEMTYPE_INVALID); 26 // TODO(teravest): Temporarily create hosts in both the browser and renderer 27 // while we move file related hosts to the browser. 28 SendCreate(RENDERER, PpapiHostMsg_FileSystem_Create(type_)); 29 SendCreate(BROWSER, PpapiHostMsg_FileSystem_Create(type_)); 30} 31 32FileSystemResource::~FileSystemResource() { 33} 34 35PPB_FileSystem_API* FileSystemResource::AsPPB_FileSystem_API() { 36 return this; 37} 38 39int32_t FileSystemResource::Open(int64_t expected_size, 40 scoped_refptr<TrackedCallback> callback) { 41 DCHECK(type_ != PP_FILESYSTEMTYPE_ISOLATED); 42 if (called_open_) 43 return PP_ERROR_FAILED; 44 called_open_ = true; 45 46 Call<PpapiPluginMsg_FileSystem_OpenReply>(RENDERER, 47 PpapiHostMsg_FileSystem_Open(expected_size), 48 base::Bind(&FileSystemResource::OpenComplete, 49 this, 50 callback)); 51 Call<PpapiPluginMsg_FileSystem_OpenReply>(BROWSER, 52 PpapiHostMsg_FileSystem_Open(expected_size), 53 base::Bind(&FileSystemResource::OpenComplete, 54 this, 55 callback)); 56 return PP_OK_COMPLETIONPENDING; 57} 58 59PP_FileSystemType FileSystemResource::GetType() { 60 return type_; 61} 62 63int32_t FileSystemResource::InitIsolatedFileSystem( 64 const std::string& fsid, 65 const base::Callback<void(int32_t)>& callback) { 66 // This call is mutually exclusive with Open() above, so we can reuse the 67 // called_open state. 68 DCHECK(type_ == PP_FILESYSTEMTYPE_ISOLATED); 69 if (called_open_) 70 return PP_ERROR_FAILED; 71 called_open_ = true; 72 73 Call<PpapiPluginMsg_FileSystem_InitIsolatedFileSystemReply>(RENDERER, 74 PpapiHostMsg_FileSystem_InitIsolatedFileSystem(fsid), 75 base::Bind(&FileSystemResource::InitIsolatedFileSystemComplete, 76 this, 77 callback)); 78 Call<PpapiPluginMsg_FileSystem_InitIsolatedFileSystemReply>(BROWSER, 79 PpapiHostMsg_FileSystem_InitIsolatedFileSystem(fsid), 80 base::Bind(&FileSystemResource::InitIsolatedFileSystemComplete, 81 this, 82 callback)); 83 return PP_OK_COMPLETIONPENDING; 84} 85 86void FileSystemResource::OpenComplete( 87 scoped_refptr<TrackedCallback> callback, 88 const ResourceMessageReplyParams& params) { 89 ++callback_count_; 90 // Received callback from browser and renderer. 91 if (callback_count_ == 2) 92 callback->Run(params.result()); 93} 94 95void FileSystemResource::InitIsolatedFileSystemComplete( 96 const base::Callback<void(int32_t)>& callback, 97 const ResourceMessageReplyParams& params) { 98 ++callback_count_; 99 // Received callback from browser and renderer. 100 if (callback_count_ == 2) 101 callback.Run(params.result()); 102} 103 104} // namespace proxy 105} // namespace ppapi 106