Home | History | Annotate | Download | only in proxy
      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 
     13 using ppapi::thunk::PPB_FileSystem_API;
     14 
     15 namespace ppapi {
     16 namespace proxy {
     17 
     18 FileSystemResource::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 
     32 FileSystemResource::~FileSystemResource() {
     33 }
     34 
     35 PPB_FileSystem_API* FileSystemResource::AsPPB_FileSystem_API() {
     36   return this;
     37 }
     38 
     39 int32_t FileSystemResource::Open(int64_t expected_size,
     40                                  scoped_refptr<TrackedCallback> callback) {
     41   if (called_open_)
     42     return PP_ERROR_FAILED;
     43   called_open_ = true;
     44 
     45   Call<PpapiPluginMsg_FileSystem_OpenReply>(RENDERER,
     46       PpapiHostMsg_FileSystem_Open(expected_size),
     47       base::Bind(&FileSystemResource::OpenComplete,
     48                  this,
     49                  callback));
     50   Call<PpapiPluginMsg_FileSystem_OpenReply>(BROWSER,
     51       PpapiHostMsg_FileSystem_Open(expected_size),
     52       base::Bind(&FileSystemResource::OpenComplete,
     53                  this,
     54                  callback));
     55   return PP_OK_COMPLETIONPENDING;
     56 }
     57 
     58 PP_FileSystemType FileSystemResource::GetType() {
     59   return type_;
     60 }
     61 
     62 void FileSystemResource::InitIsolatedFileSystem(const char* fsid) {
     63   Post(RENDERER,
     64        PpapiHostMsg_FileSystem_InitIsolatedFileSystem(std::string(fsid)));
     65   Post(BROWSER,
     66        PpapiHostMsg_FileSystem_InitIsolatedFileSystem(std::string(fsid)));
     67 }
     68 
     69 void FileSystemResource::OpenComplete(
     70     scoped_refptr<TrackedCallback> callback,
     71     const ResourceMessageReplyParams& params) {
     72   ++callback_count_;
     73   // Received callback from browser and renderer.
     74   if (callback_count_ == 2)
     75     callback->Run(params.result());
     76 }
     77 
     78 }  // namespace proxy
     79 }  // namespace ppapi
     80