OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ppapi/proxy/ppb_file_ref_proxy.h" | 5 #include "ppapi/proxy/ppb_file_ref_proxy.h" |
6 | 6 |
7 #include "ppapi/c/pp_errors.h" | 7 #include "ppapi/c/pp_errors.h" |
8 #include "ppapi/c/ppb_file_ref.h" | 8 #include "ppapi/c/ppb_file_ref.h" |
9 #include "ppapi/c/private/ppb_proxy_private.h" | 9 #include "ppapi/c/private/ppb_proxy_private.h" |
10 #include "ppapi/proxy/enter_proxy.h" | 10 #include "ppapi/proxy/enter_proxy.h" |
11 #include "ppapi/proxy/host_dispatcher.h" | 11 #include "ppapi/proxy/host_dispatcher.h" |
12 #include "ppapi/proxy/plugin_dispatcher.h" | 12 #include "ppapi/proxy/plugin_dispatcher.h" |
13 #include "ppapi/proxy/plugin_resource.h" | |
14 #include "ppapi/proxy/ppapi_messages.h" | 13 #include "ppapi/proxy/ppapi_messages.h" |
15 #include "ppapi/proxy/serialized_var.h" | 14 #include "ppapi/proxy/serialized_var.h" |
16 #include "ppapi/thunk/ppb_file_ref_api.h" | 15 #include "ppapi/thunk/ppb_file_ref_api.h" |
17 #include "ppapi/thunk/resource_creation_api.h" | 16 #include "ppapi/thunk/resource_creation_api.h" |
18 #include "ppapi/thunk/thunk.h" | 17 #include "ppapi/thunk/thunk.h" |
19 | 18 |
20 using ppapi::HostResource; | 19 using ppapi::HostResource; |
| 20 using ppapi::Resource; |
21 using ppapi::thunk::EnterFunctionNoLock; | 21 using ppapi::thunk::EnterFunctionNoLock; |
22 using ppapi::thunk::EnterResourceNoLock; | 22 using ppapi::thunk::EnterResourceNoLock; |
23 using ppapi::thunk::PPB_FileRef_API; | 23 using ppapi::thunk::PPB_FileRef_API; |
24 using ppapi::thunk::ResourceCreationAPI; | 24 using ppapi::thunk::ResourceCreationAPI; |
25 | 25 |
26 namespace pp { | 26 namespace pp { |
27 namespace proxy { | 27 namespace proxy { |
28 | 28 |
29 namespace { | 29 namespace { |
30 | 30 |
31 InterfaceProxy* CreateFileRefProxy(Dispatcher* dispatcher, | 31 InterfaceProxy* CreateFileRefProxy(Dispatcher* dispatcher, |
32 const void* target_interface) { | 32 const void* target_interface) { |
33 return new PPB_FileRef_Proxy(dispatcher, target_interface); | 33 return new PPB_FileRef_Proxy(dispatcher, target_interface); |
34 } | 34 } |
35 | 35 |
36 } // namespace | 36 } // namespace |
37 | 37 |
38 class FileRef : public PluginResource, public PPB_FileRef_API { | 38 class FileRef : public Resource, public PPB_FileRef_API { |
39 public: | 39 public: |
40 explicit FileRef(const PPBFileRef_CreateInfo& info); | 40 explicit FileRef(const PPBFileRef_CreateInfo& info); |
41 virtual ~FileRef(); | 41 virtual ~FileRef(); |
42 | 42 |
43 // ResourceObjectBase overrides. | 43 // Resource overrides. |
44 virtual PPB_FileRef_API* AsPPB_FileRef_API() OVERRIDE; | 44 virtual PPB_FileRef_API* AsPPB_FileRef_API() OVERRIDE; |
45 | 45 |
46 // PPB_FileRef_API implementation. | 46 // PPB_FileRef_API implementation. |
47 virtual PP_FileSystemType GetFileSystemType() const OVERRIDE; | 47 virtual PP_FileSystemType GetFileSystemType() const OVERRIDE; |
48 virtual PP_Var GetName() const OVERRIDE; | 48 virtual PP_Var GetName() const OVERRIDE; |
49 virtual PP_Var GetPath() const OVERRIDE; | 49 virtual PP_Var GetPath() const OVERRIDE; |
50 virtual PP_Resource GetParent() OVERRIDE; | 50 virtual PP_Resource GetParent() OVERRIDE; |
51 virtual int32_t MakeDirectory(PP_Bool make_ancestors, | 51 virtual int32_t MakeDirectory(PP_Bool make_ancestors, |
52 PP_CompletionCallback callback) OVERRIDE; | 52 PP_CompletionCallback callback) OVERRIDE; |
53 virtual int32_t Touch(PP_Time last_access_time, | 53 virtual int32_t Touch(PP_Time last_access_time, |
54 PP_Time last_modified_time, | 54 PP_Time last_modified_time, |
55 PP_CompletionCallback callback) OVERRIDE; | 55 PP_CompletionCallback callback) OVERRIDE; |
56 virtual int32_t Delete(PP_CompletionCallback callback) OVERRIDE; | 56 virtual int32_t Delete(PP_CompletionCallback callback) OVERRIDE; |
57 virtual int32_t Rename(PP_Resource new_file_ref, | 57 virtual int32_t Rename(PP_Resource new_file_ref, |
58 PP_CompletionCallback callback) OVERRIDE; | 58 PP_CompletionCallback callback) OVERRIDE; |
59 | 59 |
60 private: | 60 private: |
| 61 PluginDispatcher* GetDispatcher() const { |
| 62 return PluginDispatcher::GetForResource(this); |
| 63 } |
| 64 |
61 PP_FileSystemType file_system_type_; | 65 PP_FileSystemType file_system_type_; |
62 PP_Var path_; | 66 PP_Var path_; |
63 PP_Var name_; | 67 PP_Var name_; |
64 | 68 |
65 DISALLOW_COPY_AND_ASSIGN(FileRef); | 69 DISALLOW_COPY_AND_ASSIGN(FileRef); |
66 }; | 70 }; |
67 | 71 |
68 FileRef::FileRef(const PPBFileRef_CreateInfo& info) | 72 FileRef::FileRef(const PPBFileRef_CreateInfo& info) |
69 : PluginResource(info.resource) { | 73 : Resource(info.resource) { |
70 Dispatcher* dispatcher = PluginDispatcher::GetForInstance(instance()); | 74 Dispatcher* dispatcher = PluginDispatcher::GetForInstance(pp_instance()); |
71 | 75 |
72 file_system_type_ = static_cast<PP_FileSystemType>(info.file_system_type); | 76 file_system_type_ = static_cast<PP_FileSystemType>(info.file_system_type); |
73 | 77 |
74 name_ = ReceiveSerializedVarReturnValue(info.name).Return(dispatcher); | 78 name_ = ReceiveSerializedVarReturnValue(info.name).Return(dispatcher); |
75 path_ = ReceiveSerializedVarReturnValue(info.path).Return(dispatcher); | 79 path_ = ReceiveSerializedVarReturnValue(info.path).Return(dispatcher); |
76 } | 80 } |
77 | 81 |
78 FileRef::~FileRef() { | 82 FileRef::~FileRef() { |
79 PluginVarTracker& var_tracker = | 83 PluginVarTracker& var_tracker = |
80 PluginResourceTracker::GetInstance()->var_tracker(); | 84 PluginResourceTracker::GetInstance()->var_tracker(); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 | 131 |
128 int32_t FileRef::Delete(PP_CompletionCallback callback) { | 132 int32_t FileRef::Delete(PP_CompletionCallback callback) { |
129 GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Delete( | 133 GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Delete( |
130 INTERFACE_ID_PPB_FILE_REF, host_resource(), | 134 INTERFACE_ID_PPB_FILE_REF, host_resource(), |
131 GetDispatcher()->callback_tracker().SendCallback(callback))); | 135 GetDispatcher()->callback_tracker().SendCallback(callback))); |
132 return PP_OK_COMPLETIONPENDING; | 136 return PP_OK_COMPLETIONPENDING; |
133 } | 137 } |
134 | 138 |
135 int32_t FileRef::Rename(PP_Resource new_file_ref, | 139 int32_t FileRef::Rename(PP_Resource new_file_ref, |
136 PP_CompletionCallback callback) { | 140 PP_CompletionCallback callback) { |
137 PluginResource* new_file_ref_object = | 141 Resource* new_file_ref_object = |
138 PluginResourceTracker::GetInstance()->GetResourceObject(new_file_ref); | 142 PluginResourceTracker::GetInstance()->GetResource(new_file_ref); |
139 if (!new_file_ref_object || | 143 if (!new_file_ref_object || |
140 new_file_ref_object->host_resource().instance() != instance()) | 144 new_file_ref_object->host_resource().instance() != pp_instance()) |
141 return PP_ERROR_BADRESOURCE; | 145 return PP_ERROR_BADRESOURCE; |
142 | 146 |
143 GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Rename( | 147 GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Rename( |
144 INTERFACE_ID_PPB_FILE_REF, host_resource(), | 148 INTERFACE_ID_PPB_FILE_REF, host_resource(), |
145 new_file_ref_object->host_resource(), | 149 new_file_ref_object->host_resource(), |
146 GetDispatcher()->callback_tracker().SendCallback(callback))); | 150 GetDispatcher()->callback_tracker().SendCallback(callback))); |
147 return PP_OK_COMPLETIONPENDING; | 151 return PP_OK_COMPLETIONPENDING; |
148 } | 152 } |
149 | 153 |
150 PPB_FileRef_Proxy::PPB_FileRef_Proxy(Dispatcher* dispatcher, | 154 PPB_FileRef_Proxy::PPB_FileRef_Proxy(Dispatcher* dispatcher, |
(...skipping 11 matching lines...) Expand all Loading... |
162 INTERFACE_ID_PPB_FILE_REF, | 166 INTERFACE_ID_PPB_FILE_REF, |
163 false, | 167 false, |
164 &CreateFileRefProxy, | 168 &CreateFileRefProxy, |
165 }; | 169 }; |
166 return &info; | 170 return &info; |
167 } | 171 } |
168 | 172 |
169 // static | 173 // static |
170 PP_Resource PPB_FileRef_Proxy::CreateProxyResource(PP_Resource file_system, | 174 PP_Resource PPB_FileRef_Proxy::CreateProxyResource(PP_Resource file_system, |
171 const char* path) { | 175 const char* path) { |
172 PluginResource* file_system_object = | 176 Resource* file_system_object = |
173 PluginResourceTracker::GetInstance()->GetResourceObject(file_system); | 177 PluginResourceTracker::GetInstance()->GetResource(file_system); |
174 if (!file_system_object) | 178 if (!file_system_object) |
175 return 0; | 179 return 0; |
176 | 180 |
177 PPBFileRef_CreateInfo create_info; | 181 PPBFileRef_CreateInfo create_info; |
178 file_system_object->GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Create( | 182 PluginDispatcher::GetForResource(file_system_object)->Send( |
179 INTERFACE_ID_PPB_FILE_REF, file_system_object->host_resource(), | 183 new PpapiHostMsg_PPBFileRef_Create( |
180 path, &create_info)); | 184 INTERFACE_ID_PPB_FILE_REF, file_system_object->host_resource(), |
| 185 path, &create_info)); |
181 return PPB_FileRef_Proxy::DeserializeFileRef(create_info); | 186 return PPB_FileRef_Proxy::DeserializeFileRef(create_info); |
182 } | 187 } |
183 | 188 |
184 bool PPB_FileRef_Proxy::OnMessageReceived(const IPC::Message& msg) { | 189 bool PPB_FileRef_Proxy::OnMessageReceived(const IPC::Message& msg) { |
185 bool handled = true; | 190 bool handled = true; |
186 IPC_BEGIN_MESSAGE_MAP(PPB_FileRef_Proxy, msg) | 191 IPC_BEGIN_MESSAGE_MAP(PPB_FileRef_Proxy, msg) |
187 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_Create, OnMsgCreate) | 192 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_Create, OnMsgCreate) |
188 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_GetParent, OnMsgGetParent) | 193 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_GetParent, OnMsgGetParent) |
189 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_MakeDirectory, | 194 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_MakeDirectory, |
190 OnMsgMakeDirectory) | 195 OnMsgMakeDirectory) |
(...skipping 30 matching lines...) Expand all Loading... |
221 enter.object()->GetPath()); | 226 enter.object()->GetPath()); |
222 result->name = SerializedVarReturnValue::Convert(dispatcher(), | 227 result->name = SerializedVarReturnValue::Convert(dispatcher(), |
223 enter.object()->GetName()); | 228 enter.object()->GetName()); |
224 } | 229 } |
225 | 230 |
226 // static | 231 // static |
227 PP_Resource PPB_FileRef_Proxy::DeserializeFileRef( | 232 PP_Resource PPB_FileRef_Proxy::DeserializeFileRef( |
228 const PPBFileRef_CreateInfo& serialized) { | 233 const PPBFileRef_CreateInfo& serialized) { |
229 if (serialized.resource.is_null()) | 234 if (serialized.resource.is_null()) |
230 return 0; // Resource invalid. | 235 return 0; // Resource invalid. |
231 | 236 return (new FileRef(serialized))->GetReference(); |
232 return PluginResourceTracker::GetInstance()->AddResource( | |
233 new FileRef(serialized)); | |
234 } | 237 } |
235 | 238 |
236 void PPB_FileRef_Proxy::OnMsgCreate(const HostResource& file_system, | 239 void PPB_FileRef_Proxy::OnMsgCreate(const HostResource& file_system, |
237 const std::string& path, | 240 const std::string& path, |
238 PPBFileRef_CreateInfo* result) { | 241 PPBFileRef_CreateInfo* result) { |
239 EnterFunctionNoLock<ResourceCreationAPI> enter(file_system.instance(), true); | 242 EnterFunctionNoLock<ResourceCreationAPI> enter(file_system.instance(), true); |
240 if (enter.failed()) | 243 if (enter.failed()) |
241 return; | 244 return; |
242 PP_Resource resource = enter.functions()->CreateFileRef( | 245 PP_Resource resource = enter.functions()->CreateFileRef( |
243 file_system.host_resource(), path.c_str()); | 246 file_system.host_resource(), path.c_str()); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 return; | 300 return; |
298 PP_CompletionCallback callback = ReceiveCallback(serialized_callback); | 301 PP_CompletionCallback callback = ReceiveCallback(serialized_callback); |
299 int32_t result = enter.object()->Rename(new_file_ref.host_resource(), | 302 int32_t result = enter.object()->Rename(new_file_ref.host_resource(), |
300 callback); | 303 callback); |
301 if (result != PP_OK_COMPLETIONPENDING) | 304 if (result != PP_OK_COMPLETIONPENDING) |
302 PP_RunCompletionCallback(&callback, result); | 305 PP_RunCompletionCallback(&callback, result); |
303 } | 306 } |
304 | 307 |
305 } // namespace proxy | 308 } // namespace proxy |
306 } // namespace pp | 309 } // namespace pp |
OLD | NEW |