1 // Copyright (c) 2012 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.
5 #include "ppapi/proxy/ppb_file_system_proxy.h"
8 #include "base/message_loop.h"
9 #include "ppapi/c/pp_errors.h"
10 #include "ppapi/c/ppb_file_system.h"
11 #include "ppapi/proxy/enter_proxy.h"
12 #include "ppapi/proxy/host_dispatcher.h"
13 #include "ppapi/proxy/plugin_dispatcher.h"
14 #include "ppapi/proxy/ppapi_messages.h"
15 #include "ppapi/proxy/serialized_var.h"
16 #include "ppapi/shared_impl/tracked_callback.h"
17 #include "ppapi/thunk/enter.h"
18 #include "ppapi/thunk/ppb_file_system_api.h"
19 #include "ppapi/thunk/resource_creation_api.h"
20 #include "ppapi/thunk/thunk.h"
22 using ppapi::thunk::PPB_FileSystem_API
;
23 using ppapi::thunk::ResourceCreationAPI
;
30 InterfaceProxy
* CreateFileSystemProxy(Dispatcher
* dispatcher
) {
31 return new PPB_FileSystem_Proxy(dispatcher
);
36 // This object maintains most of the state of the ref in the plugin for fast
37 // querying. It's all set in the constructor from the "create info" sent from
39 class FileSystem
: public Resource
, public PPB_FileSystem_API
{
41 FileSystem(const HostResource
& host_resource
, PP_FileSystemType type
);
42 virtual ~FileSystem();
45 virtual PPB_FileSystem_API
* AsPPB_FileSystem_API() OVERRIDE
;
47 // PPB_FileSystem_APi implementation.
48 virtual int32_t Open(int64_t expected_size
,
49 scoped_refptr
<TrackedCallback
> callback
) OVERRIDE
;
50 virtual PP_FileSystemType
GetType() OVERRIDE
;
52 // Called when the host has responded to our open request.
53 void OpenComplete(int32_t result
);
56 PP_FileSystemType type_
;
58 scoped_refptr
<TrackedCallback
> current_open_callback_
;
60 DISALLOW_COPY_AND_ASSIGN(FileSystem
);
63 FileSystem::FileSystem(const HostResource
& host_resource
,
64 PP_FileSystemType type
)
65 : Resource(OBJECT_IS_PROXY
, host_resource
),
70 FileSystem::~FileSystem() {
73 PPB_FileSystem_API
* FileSystem::AsPPB_FileSystem_API() {
77 int32_t FileSystem::Open(int64_t expected_size
,
78 scoped_refptr
<TrackedCallback
> callback
) {
79 if (TrackedCallback::IsPending(current_open_callback_
))
80 return PP_ERROR_INPROGRESS
;
82 return PP_ERROR_FAILED
;
84 current_open_callback_
= callback
;
86 PluginDispatcher::GetForResource(this)->Send(
87 new PpapiHostMsg_PPBFileSystem_Open(
88 API_ID_PPB_FILE_SYSTEM
, host_resource(), expected_size
));
89 return PP_OK_COMPLETIONPENDING
;
92 PP_FileSystemType
FileSystem::GetType() {
96 void FileSystem::OpenComplete(int32_t result
) {
97 current_open_callback_
->Run(result
);
100 PPB_FileSystem_Proxy::PPB_FileSystem_Proxy(Dispatcher
* dispatcher
)
101 : InterfaceProxy(dispatcher
),
102 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
105 PPB_FileSystem_Proxy::~PPB_FileSystem_Proxy() {
108 const InterfaceProxy::Info
* PPB_FileSystem_Proxy::GetInfo() {
109 static const Info info
= {
110 thunk::GetPPB_FileSystem_1_0_Thunk(),
111 PPB_FILESYSTEM_INTERFACE_1_0
,
112 API_ID_PPB_FILE_SYSTEM
,
114 &CreateFileSystemProxy
,
120 PP_Resource
PPB_FileSystem_Proxy::CreateProxyResource(
121 PP_Instance instance
,
122 PP_FileSystemType type
) {
123 PluginDispatcher
* dispatcher
= PluginDispatcher::GetForInstance(instance
);
125 return PP_ERROR_BADARGUMENT
;
128 dispatcher
->Send(new PpapiHostMsg_PPBFileSystem_Create(
129 API_ID_PPB_FILE_SYSTEM
, instance
, type
, &result
));
130 if (result
.is_null())
132 return (new FileSystem(result
, type
))->GetReference();
135 bool PPB_FileSystem_Proxy::OnMessageReceived(const IPC::Message
& msg
) {
137 IPC_BEGIN_MESSAGE_MAP(PPB_FileSystem_Proxy
, msg
)
138 #if !defined(OS_NACL)
139 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileSystem_Create
, OnMsgCreate
)
140 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileSystem_Open
, OnMsgOpen
)
142 IPC_MESSAGE_HANDLER(PpapiMsg_PPBFileSystem_OpenComplete
, OnMsgOpenComplete
)
143 IPC_MESSAGE_UNHANDLED(handled
= false)
144 IPC_END_MESSAGE_MAP()
148 #if !defined(OS_NACL)
149 void PPB_FileSystem_Proxy::OnMsgCreate(PP_Instance instance
,
151 HostResource
* result
) {
152 thunk::EnterResourceCreation
enter(instance
);
155 PP_Resource resource
= enter
.functions()->CreateFileSystem(
156 instance
, static_cast<PP_FileSystemType
>(type
));
158 return; // CreateInfo default constructor initializes to 0.
159 result
->SetHostResource(instance
, resource
);
162 void PPB_FileSystem_Proxy::OnMsgOpen(const HostResource
& host_resource
,
163 int64_t expected_size
) {
164 EnterHostFromHostResourceForceCallback
<PPB_FileSystem_API
> enter(
165 host_resource
, callback_factory_
,
166 &PPB_FileSystem_Proxy::OpenCompleteInHost
, host_resource
);
167 if (enter
.succeeded())
168 enter
.SetResult(enter
.object()->Open(expected_size
, enter
.callback()));
170 #endif // !defined(OS_NACL)
172 // Called in the plugin to handle the open callback.
173 void PPB_FileSystem_Proxy::OnMsgOpenComplete(const HostResource
& host_resource
,
175 EnterPluginFromHostResource
<PPB_FileSystem_API
> enter(host_resource
);
176 if (enter
.succeeded())
177 static_cast<FileSystem
*>(enter
.object())->OpenComplete(result
);
180 #if !defined(OS_NACL)
181 void PPB_FileSystem_Proxy::OpenCompleteInHost(
183 const HostResource
& host_resource
) {
184 dispatcher()->Send(new PpapiMsg_PPBFileSystem_OpenComplete(
185 API_ID_PPB_FILE_SYSTEM
, host_resource
, result
));
187 #endif // !defined(OS_NACL)