Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(159)

Side by Side Diff: ppapi/proxy/ppb_file_ref_proxy.cc

Issue 6519057: Implement proxying for FileRef and FileChooser.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Fix ppapi tests to account for query change Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ppapi/proxy/ppb_file_ref_proxy.h ('k') | ppapi/proxy/ppb_url_loader_proxy.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "ppapi/proxy/ppb_file_ref_proxy.h"
6
7 #include "ppapi/c/dev/ppb_file_ref_dev.h"
8 #include "ppapi/c/pp_errors.h"
9 #include "ppapi/c/private/ppb_proxy_private.h"
10 #include "ppapi/proxy/host_dispatcher.h"
11 #include "ppapi/proxy/plugin_dispatcher.h"
12 #include "ppapi/proxy/plugin_resource.h"
13 #include "ppapi/proxy/ppapi_messages.h"
14 #include "ppapi/proxy/serialized_var.h"
15
16 namespace pp {
17 namespace proxy {
18
19 // This object maintains most of the state of the ref in the plugin for fast
20 // querying. It's all set in the constructor from the "create info" sent from
21 // the host.
22 class FileRef : public PluginResource {
23 public:
24 FileRef(const PPBFileRef_CreateInfo& info);
25 virtual ~FileRef();
26
27 virtual FileRef* AsFileRef();
28
29 PP_FileSystemType_Dev file_system_type() const { return file_system_type_; }
30 const PP_Var& path() const { return path_; }
31 const PP_Var& name() const { return name_; }
32
33 private:
34 PP_FileSystemType_Dev file_system_type_;
35 PP_Var path_;
36 PP_Var name_;
37
38 DISALLOW_COPY_AND_ASSIGN(FileRef);
39 };
40
41 FileRef::FileRef(const PPBFileRef_CreateInfo& info)
42 : PluginResource(info.resource) {
43 Dispatcher* dispatcher = PluginDispatcher::GetForInstance(instance());
44
45 file_system_type_ = static_cast<PP_FileSystemType_Dev>(info.file_system_type);
46
47 name_ = ReceiveSerializedVarReturnValue::Convert(dispatcher, info.name);
48 path_ = ReceiveSerializedVarReturnValue::Convert(dispatcher, info.path);
49 }
50
51 FileRef::~FileRef() {
52 PluginVarTracker::GetInstance()->Release(path_);
53 PluginVarTracker::GetInstance()->Release(name_);
54 }
55
56 FileRef* FileRef::AsFileRef() {
57 return this;
58 }
59
60 namespace {
61
62 bool FileRefAndDispatcherForResource(PP_Resource resource,
63 FileRef** file_ref,
64 Dispatcher** dispatcher) {
65 *file_ref = PluginResource::GetAs<FileRef>(resource);
66 if (!file_ref)
67 return false;
68 *dispatcher = PluginDispatcher::GetForInstance((*file_ref)->instance());
69 return !!(*dispatcher);
70 }
71
72 PP_Resource Create(PP_Resource file_system, const char* path) {
73 PluginResource* file_system_object =
74 PluginResourceTracker::GetInstance()->GetResourceObject(file_system);
75 if (!file_system_object)
76 return 0;
77
78 Dispatcher* dispatcher =
79 PluginDispatcher::GetForInstance(file_system_object->instance());
80 if (!dispatcher)
81 return 0;
82
83 PPBFileRef_CreateInfo create_info;
84 dispatcher->Send(new PpapiHostMsg_PPBFileRef_Create(
85 INTERFACE_ID_PPB_FILE_REF, file_system_object->host_resource(),
86 path, &create_info));
87 return PPB_FileRef_Proxy::DeserializeFileRef(create_info);
88 }
89
90 PP_Bool IsFileRef(PP_Resource resource) {
91 FileRef* object = PluginResource::GetAs<FileRef>(resource);
92 return BoolToPPBool(!!object);
93 }
94
95 PP_FileSystemType_Dev GetFileSystemType(PP_Resource file_ref) {
96 FileRef* object = PluginResource::GetAs<FileRef>(file_ref);
97 if (!object)
98 return PP_FILESYSTEMTYPE_EXTERNAL;
99 return object->file_system_type();
100 }
101
102 PP_Var GetName(PP_Resource file_ref) {
103 FileRef* object = PluginResource::GetAs<FileRef>(file_ref);
104 if (!object)
105 return PP_MakeUndefined();
106
107 PluginVarTracker::GetInstance()->AddRef(object->name());
108 return object->name();
109 }
110
111 PP_Var GetPath(PP_Resource file_ref) {
112 FileRef* object = PluginResource::GetAs<FileRef>(file_ref);
113 if (!object)
114 return PP_MakeUndefined();
115
116 PluginVarTracker::GetInstance()->AddRef(object->path());
117 return object->path();
118 }
119
120 PP_Resource GetParent(PP_Resource file_ref) {
121 FileRef* object;
122 Dispatcher* dispatcher;
123 if (!FileRefAndDispatcherForResource(file_ref, &object, &dispatcher))
124 return 0;
125
126 PPBFileRef_CreateInfo create_info;
127 dispatcher->Send(new PpapiHostMsg_PPBFileRef_GetParent(
128 INTERFACE_ID_PPB_FILE_REF, object->host_resource(), &create_info));
129 return PPB_FileRef_Proxy::DeserializeFileRef(create_info);
130 }
131
132 int32_t MakeDirectory(PP_Resource directory_ref,
133 PP_Bool make_ancestors,
134 struct PP_CompletionCallback callback) {
135 FileRef* object;
136 Dispatcher* dispatcher;
137 if (!FileRefAndDispatcherForResource(directory_ref, &object, &dispatcher))
138 return PP_ERROR_BADRESOURCE;
139
140 dispatcher->Send(new PpapiHostMsg_PPBFileRef_MakeDirectory(
141 INTERFACE_ID_PPB_FILE_REF, object->host_resource(), make_ancestors,
142 dispatcher->callback_tracker().SendCallback(callback)));
143 return PP_ERROR_WOULDBLOCK;
144 }
145
146 int32_t Touch(PP_Resource file_ref,
147 PP_Time last_access_time,
148 PP_Time last_modified_time,
149 struct PP_CompletionCallback callback) {
150 FileRef* object;
151 Dispatcher* dispatcher;
152 if (!FileRefAndDispatcherForResource(file_ref, &object, &dispatcher))
153 return PP_ERROR_BADRESOURCE;
154
155 dispatcher->Send(new PpapiHostMsg_PPBFileRef_Touch(
156 INTERFACE_ID_PPB_FILE_REF, object->host_resource(),
157 last_access_time, last_modified_time,
158 dispatcher->callback_tracker().SendCallback(callback)));
159 return PP_ERROR_WOULDBLOCK;
160 }
161
162 int32_t Delete(PP_Resource file_ref,
163 struct PP_CompletionCallback callback) {
164 FileRef* object;
165 Dispatcher* dispatcher;
166 if (!FileRefAndDispatcherForResource(file_ref, &object, &dispatcher))
167 return PP_ERROR_BADRESOURCE;
168
169 dispatcher->Send(new PpapiHostMsg_PPBFileRef_Delete(
170 INTERFACE_ID_PPB_FILE_REF, object->host_resource(),
171 dispatcher->callback_tracker().SendCallback(callback)));
172 return PP_ERROR_WOULDBLOCK;
173 }
174
175 int32_t Rename(PP_Resource file_ref,
176 PP_Resource new_file_ref,
177 struct PP_CompletionCallback callback) {
178 FileRef* obj1;
179 Dispatcher* dispatcher1;
180 if (!FileRefAndDispatcherForResource(file_ref, &obj1, &dispatcher1))
181 return PP_ERROR_BADRESOURCE;
182
183 FileRef* obj2;
184 Dispatcher* dispatcher2;
185 if (!FileRefAndDispatcherForResource(new_file_ref, &obj2, &dispatcher2))
186 return PP_ERROR_BADRESOURCE;
187
188 if (obj1->instance() != obj2->instance())
189 return PP_ERROR_BADRESOURCE;
190
191 dispatcher1->Send(new PpapiHostMsg_PPBFileRef_Rename(
192 INTERFACE_ID_PPB_FILE_REF, obj1->host_resource(),
193 obj2->host_resource(),
194 dispatcher1->callback_tracker().SendCallback(callback)));
195 return PP_ERROR_WOULDBLOCK;
196 }
197
198 const PPB_FileRef_Dev file_ref_interface = {
199 &Create,
200 &IsFileRef,
201 &GetFileSystemType,
202 &GetName,
203 &GetPath,
204 &GetParent,
205 &MakeDirectory,
206 &Touch,
207 &Delete,
208 &Rename
209 };
210
211 InterfaceProxy* CreateFileRefProxy(Dispatcher* dispatcher,
212 const void* target_interface) {
213 return new PPB_FileRef_Proxy(dispatcher, target_interface);
214 }
215
216 } // namespace
217
218 PPB_FileRef_Proxy::PPB_FileRef_Proxy(Dispatcher* dispatcher,
219 const void* target_interface)
220 : InterfaceProxy(dispatcher, target_interface) {
221 }
222
223 PPB_FileRef_Proxy::~PPB_FileRef_Proxy() {
224 }
225
226 const InterfaceProxy::Info* PPB_FileRef_Proxy::GetInfo() {
227 static const Info info = {
228 &file_ref_interface,
229 PPB_FILEREF_DEV_INTERFACE,
230 INTERFACE_ID_PPB_FILE_REF,
231 false,
232 &CreateFileRefProxy,
233 };
234 return &info;
235 }
236
237 bool PPB_FileRef_Proxy::OnMessageReceived(const IPC::Message& msg) {
238 bool handled = true;
239 IPC_BEGIN_MESSAGE_MAP(PPB_FileRef_Proxy, msg)
240 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_Create, OnMsgCreate)
241 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_GetParent, OnMsgGetParent)
242 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_MakeDirectory,
243 OnMsgMakeDirectory)
244 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_Touch, OnMsgTouch)
245 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_Delete, OnMsgDelete)
246 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_Rename, OnMsgRename)
247 IPC_MESSAGE_UNHANDLED(handled = false)
248 IPC_END_MESSAGE_MAP()
249 return handled;
250 }
251
252 void PPB_FileRef_Proxy::SerializeFileRef(PP_Resource file_ref,
253 PPBFileRef_CreateInfo* result) {
254 // We need the instance out of the resource for serializing back to the
255 // plugin. This code can only run in the host.
256 if (dispatcher()->IsPlugin()) {
257 NOTREACHED();
258 return;
259 }
260 HostDispatcher* host_dispatcher = static_cast<HostDispatcher*>(dispatcher());
261 PP_Instance instance =
262 host_dispatcher->GetPPBProxy()->GetInstanceForResource(file_ref);
263
264 result->resource.SetHostResource(instance, file_ref);
265 result->file_system_type =
266 static_cast<int>(ppb_file_ref_target()->GetFileSystemType(file_ref));
267 result->path = SerializedVarReturnValue::Convert(
268 dispatcher(),
269 ppb_file_ref_target()->GetPath(file_ref));
270 result->name = SerializedVarReturnValue::Convert(
271 dispatcher(),
272 ppb_file_ref_target()->GetName(file_ref));
273 }
274
275 // static
276 PP_Resource PPB_FileRef_Proxy::DeserializeFileRef(
277 const PPBFileRef_CreateInfo& serialized) {
278 if (serialized.resource.is_null())
279 return 0; // Resource invalid.
280
281 linked_ptr<FileRef> object(new FileRef(serialized));
282 return PluginResourceTracker::GetInstance()->AddResource(object);
283 }
284
285 void PPB_FileRef_Proxy::OnMsgCreate(const HostResource& file_system,
286 const std::string& path,
287 PPBFileRef_CreateInfo* result) {
288
289 PP_Resource resource = ppb_file_ref_target()->Create(
290 file_system.host_resource(), path.c_str());
291 if (!resource)
292 return; // CreateInfo default constructor initializes to 0.
293 SerializeFileRef(resource, result);
294 }
295
296 void PPB_FileRef_Proxy::OnMsgGetParent(const HostResource& host_resource,
297 PPBFileRef_CreateInfo* result) {
298 PP_Resource resource = ppb_file_ref_target()->GetParent(
299 host_resource.host_resource());
300 if (!resource)
301 return; // CreateInfo default constructor initializes to 0.
302 SerializeFileRef(resource, result);
303 }
304
305 void PPB_FileRef_Proxy::OnMsgMakeDirectory(const HostResource& host_resource,
306 PP_Bool make_ancestors,
307 uint32_t serialized_callback) {
308 PP_CompletionCallback callback = ReceiveCallback(serialized_callback);
309 int32_t result =
310 ppb_file_ref_target()->MakeDirectory(host_resource.host_resource(),
311 make_ancestors, callback);
312 if (result != PP_ERROR_WOULDBLOCK)
313 PP_RunCompletionCallback(&callback, result);
314 }
315
316 void PPB_FileRef_Proxy::OnMsgTouch(const HostResource& host_resource,
317 PP_Time last_access,
318 PP_Time last_modified,
319 uint32_t serialized_callback) {
320 PP_CompletionCallback callback = ReceiveCallback(serialized_callback);
321 int32_t result =
322 ppb_file_ref_target()->Touch(host_resource.host_resource(),
323 last_access, last_modified, callback);
324 if (result != PP_ERROR_WOULDBLOCK)
325 PP_RunCompletionCallback(&callback, result);
326 }
327
328 void PPB_FileRef_Proxy::OnMsgDelete(const HostResource& host_resource,
329 uint32_t serialized_callback) {
330 PP_CompletionCallback callback = ReceiveCallback(serialized_callback);
331 int32_t result =
332 ppb_file_ref_target()->Delete(host_resource.host_resource(), callback);
333 if (result != PP_ERROR_WOULDBLOCK)
334 PP_RunCompletionCallback(&callback, result);
335 }
336
337 void PPB_FileRef_Proxy::OnMsgRename(const HostResource& file_ref,
338 const HostResource& new_file_ref,
339 uint32_t serialized_callback) {
340 PP_CompletionCallback callback = ReceiveCallback(serialized_callback);
341 int32_t result =
342 ppb_file_ref_target()->Rename(file_ref.host_resource(),
343 new_file_ref.host_resource(),
344 callback);
345 if (result != PP_ERROR_WOULDBLOCK)
346 PP_RunCompletionCallback(&callback, result);
347 }
348
349 } // namespace proxy
350 } // namespace pp
OLDNEW
« no previous file with comments | « ppapi/proxy/ppb_file_ref_proxy.h ('k') | ppapi/proxy/ppb_url_loader_proxy.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698