• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
FileSystemResource(Connection connection,PP_Instance instance,PP_FileSystemType type)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       callback_result_(PP_OK) {
26   DCHECK(type_ != PP_FILESYSTEMTYPE_INVALID);
27   SendCreate(RENDERER, PpapiHostMsg_FileSystem_Create(type_));
28   SendCreate(BROWSER, PpapiHostMsg_FileSystem_Create(type_));
29 }
30 
FileSystemResource(Connection connection,PP_Instance instance,int pending_renderer_id,int pending_browser_id,PP_FileSystemType type)31 FileSystemResource::FileSystemResource(Connection connection,
32                                        PP_Instance instance,
33                                        int pending_renderer_id,
34                                        int pending_browser_id,
35                                        PP_FileSystemType type)
36     : PluginResource(connection, instance),
37       type_(type),
38       called_open_(true),
39       callback_count_(0),
40       callback_result_(PP_OK) {
41   DCHECK(type_ != PP_FILESYSTEMTYPE_INVALID);
42   AttachToPendingHost(RENDERER, pending_renderer_id);
43   AttachToPendingHost(BROWSER, pending_browser_id);
44 }
45 
~FileSystemResource()46 FileSystemResource::~FileSystemResource() {
47 }
48 
AsPPB_FileSystem_API()49 PPB_FileSystem_API* FileSystemResource::AsPPB_FileSystem_API() {
50   return this;
51 }
52 
Open(int64_t expected_size,scoped_refptr<TrackedCallback> callback)53 int32_t FileSystemResource::Open(int64_t expected_size,
54                                  scoped_refptr<TrackedCallback> callback) {
55   DCHECK(type_ != PP_FILESYSTEMTYPE_ISOLATED);
56   if (called_open_)
57     return PP_ERROR_FAILED;
58   called_open_ = true;
59 
60   Call<PpapiPluginMsg_FileSystem_OpenReply>(RENDERER,
61       PpapiHostMsg_FileSystem_Open(expected_size),
62       base::Bind(&FileSystemResource::OpenComplete,
63                  this,
64                  callback));
65   Call<PpapiPluginMsg_FileSystem_OpenReply>(BROWSER,
66       PpapiHostMsg_FileSystem_Open(expected_size),
67       base::Bind(&FileSystemResource::OpenComplete,
68                  this,
69                  callback));
70   return PP_OK_COMPLETIONPENDING;
71 }
72 
GetType()73 PP_FileSystemType FileSystemResource::GetType() {
74   return type_;
75 }
76 
InitIsolatedFileSystem(const std::string & fsid,PP_IsolatedFileSystemType_Private type,const base::Callback<void (int32_t)> & callback)77 int32_t FileSystemResource::InitIsolatedFileSystem(
78     const std::string& fsid,
79     PP_IsolatedFileSystemType_Private type,
80     const base::Callback<void(int32_t)>& callback) {
81   // This call is mutually exclusive with Open() above, so we can reuse the
82   // called_open state.
83   DCHECK(type_ == PP_FILESYSTEMTYPE_ISOLATED);
84   if (called_open_)
85     return PP_ERROR_FAILED;
86   called_open_ = true;
87 
88   Call<PpapiPluginMsg_FileSystem_InitIsolatedFileSystemReply>(RENDERER,
89       PpapiHostMsg_FileSystem_InitIsolatedFileSystem(fsid, type),
90       base::Bind(&FileSystemResource::InitIsolatedFileSystemComplete,
91       this,
92       callback));
93   Call<PpapiPluginMsg_FileSystem_InitIsolatedFileSystemReply>(BROWSER,
94       PpapiHostMsg_FileSystem_InitIsolatedFileSystem(fsid, type),
95       base::Bind(&FileSystemResource::InitIsolatedFileSystemComplete,
96       this,
97       callback));
98   return PP_OK_COMPLETIONPENDING;
99 }
100 
OpenComplete(scoped_refptr<TrackedCallback> callback,const ResourceMessageReplyParams & params)101 void FileSystemResource::OpenComplete(
102     scoped_refptr<TrackedCallback> callback,
103     const ResourceMessageReplyParams& params) {
104   ++callback_count_;
105   // Prioritize worse result since only one status can be returned.
106   if (params.result() != PP_OK)
107     callback_result_ = params.result();
108   // Received callback from browser and renderer.
109   if (callback_count_ == 2)
110     callback->Run(callback_result_);
111 }
112 
InitIsolatedFileSystemComplete(const base::Callback<void (int32_t)> & callback,const ResourceMessageReplyParams & params)113 void FileSystemResource::InitIsolatedFileSystemComplete(
114     const base::Callback<void(int32_t)>& callback,
115     const ResourceMessageReplyParams& params) {
116   ++callback_count_;
117   // Prioritize worse result since only one status can be returned.
118   if (params.result() != PP_OK)
119     callback_result_ = params.result();
120   // Received callback from browser and renderer.
121   if (callback_count_ == 2)
122     callback.Run(callback_result_);
123 }
124 
125 }  // namespace proxy
126 }  // namespace ppapi
127