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

Side by Side Diff: webkit/plugins/ppapi/ppb_file_io_impl.cc

Issue 8764003: Implement a proxy for Pepper FileIO. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comments addressed. Created 9 years 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
OLDNEW
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 "webkit/plugins/ppapi/ppb_file_io_impl.h" 5 #include "webkit/plugins/ppapi/ppb_file_io_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/file_util_proxy.h" 10 #include "base/file_util_proxy.h"
11 #include "base/message_loop_proxy.h" 11 #include "base/message_loop_proxy.h"
12 #include "base/platform_file.h" 12 #include "base/platform_file.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/time.h" 14 #include "base/time.h"
15 #include "ppapi/c/ppb_file_io.h" 15 #include "ppapi/c/ppb_file_io.h"
16 #include "ppapi/c/trusted/ppb_file_io_trusted.h" 16 #include "ppapi/c/trusted/ppb_file_io_trusted.h"
17 #include "ppapi/c/pp_completion_callback.h" 17 #include "ppapi/c/pp_completion_callback.h"
18 #include "ppapi/c/pp_errors.h" 18 #include "ppapi/c/pp_errors.h"
19 #include "ppapi/shared_impl/file_type_conversion.h"
19 #include "ppapi/shared_impl/time_conversion.h" 20 #include "ppapi/shared_impl/time_conversion.h"
20 #include "ppapi/thunk/enter.h" 21 #include "ppapi/thunk/enter.h"
21 #include "ppapi/thunk/ppb_file_ref_api.h" 22 #include "ppapi/thunk/ppb_file_ref_api.h"
22 #include "webkit/plugins/ppapi/common.h" 23 #include "webkit/plugins/ppapi/common.h"
23 #include "webkit/plugins/ppapi/file_type_conversions.h"
24 #include "webkit/plugins/ppapi/plugin_module.h" 24 #include "webkit/plugins/ppapi/plugin_module.h"
25 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" 25 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h"
26 #include "webkit/plugins/ppapi/ppb_file_ref_impl.h" 26 #include "webkit/plugins/ppapi/ppb_file_ref_impl.h"
27 #include "webkit/plugins/ppapi/quota_file_io.h" 27 #include "webkit/plugins/ppapi/quota_file_io.h"
28 #include "webkit/plugins/ppapi/resource_helper.h" 28 #include "webkit/plugins/ppapi/resource_helper.h"
29 29
30 using ppapi::PPTimeToTime; 30 using ppapi::PPTimeToTime;
31 using ppapi::TimeToPPTime; 31 using ppapi::TimeToPPTime;
32 using ppapi::thunk::EnterResourceNoLock;
33 using ppapi::thunk::PPB_FileIO_API;
34 using ppapi::thunk::PPB_FileRef_API; 32 using ppapi::thunk::PPB_FileRef_API;
35 33
36 namespace webkit { 34 namespace webkit {
37 namespace ppapi { 35 namespace ppapi {
38 36
39 PPB_FileIO_Impl::CallbackEntry::CallbackEntry()
40 : read_buffer(NULL) {
41 }
42
43 PPB_FileIO_Impl::CallbackEntry::CallbackEntry(const CallbackEntry& entry)
44 : callback(entry.callback),
45 read_buffer(entry.read_buffer) {
46 }
47
48 PPB_FileIO_Impl::CallbackEntry::~CallbackEntry() {
49 }
50
51 PPB_FileIO_Impl::PPB_FileIO_Impl(PP_Instance instance) 37 PPB_FileIO_Impl::PPB_FileIO_Impl(PP_Instance instance)
52 : Resource(instance), 38 : ::ppapi::FileIOImpl(instance),
53 file_(base::kInvalidPlatformFileValue), 39 file_(base::kInvalidPlatformFileValue),
54 file_system_type_(PP_FILESYSTEMTYPE_INVALID),
55 pending_op_(OPERATION_NONE),
56 info_(NULL),
57 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { 40 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
58 } 41 }
59 42
60 PPB_FileIO_Impl::~PPB_FileIO_Impl() { 43 PPB_FileIO_Impl::~PPB_FileIO_Impl() {
61 Close(); 44 Close();
62 } 45 }
63 46
64 PPB_FileIO_API* PPB_FileIO_Impl::AsPPB_FileIO_API() { 47 int32_t PPB_FileIO_Impl::OpenValidated(PP_Resource file_ref_resource,
65 return this; 48 PPB_FileRef_API* file_ref_api,
66 } 49 int32_t open_flags,
67 50 PP_CompletionCallback callback) {
68 int32_t PPB_FileIO_Impl::Open(PP_Resource pp_file_ref, 51 PPB_FileRef_Impl* file_ref = static_cast<PPB_FileRef_Impl*>(file_ref_api);
69 int32_t open_flags,
70 PP_CompletionCallback callback) {
71 EnterResourceNoLock<PPB_FileRef_API> enter(pp_file_ref, true);
72 if (enter.failed())
73 return PP_ERROR_BADRESOURCE;
74 PPB_FileRef_Impl* file_ref = static_cast<PPB_FileRef_Impl*>(enter.object());
75
76 int32_t rv = CommonCallValidation(false, OPERATION_EXCLUSIVE, callback);
77 if (rv != PP_OK)
78 return rv;
79 52
80 int flags = 0; 53 int flags = 0;
81 if (!PepperFileOpenFlagsToPlatformFileFlags(open_flags, &flags)) 54 if (!::ppapi::PepperFileOpenFlagsToPlatformFileFlags(open_flags, &flags))
82 return PP_ERROR_BADARGUMENT; 55 return PP_ERROR_BADARGUMENT;
83 56
84 PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this); 57 PluginDelegate* plugin_delegate = GetPluginDelegate();
85 if (!plugin_delegate) 58 if (!plugin_delegate)
86 return false; 59 return PP_ERROR_BADARGUMENT;
87
88 file_system_type_ = file_ref->GetFileSystemType();
89 if (file_system_type_ != PP_FILESYSTEMTYPE_LOCALPERSISTENT &&
90 file_system_type_ != PP_FILESYSTEMTYPE_LOCALTEMPORARY &&
91 file_system_type_ != PP_FILESYSTEMTYPE_EXTERNAL)
92 return PP_ERROR_FAILED;
93 60
94 if (file_ref->HasValidFileSystem()) { 61 if (file_ref->HasValidFileSystem()) {
95 file_system_url_ = file_ref->GetFileSystemURL(); 62 file_system_url_ = file_ref->GetFileSystemURL();
96 if (!plugin_delegate->AsyncOpenFileSystemURL( 63 if (!plugin_delegate->AsyncOpenFileSystemURL(
97 file_system_url_, flags, 64 file_system_url_, flags,
98 base::Bind(&PPB_FileIO_Impl::AsyncOpenFileCallback, 65 base::Bind(&PPB_FileIO_Impl::ExecutePlatformOpenFileCallback,
99 weak_factory_.GetWeakPtr()))) 66 weak_factory_.GetWeakPtr())))
100 return PP_ERROR_FAILED; 67 return PP_ERROR_FAILED;
101 } else { 68 } else {
102 if (file_system_type_ != PP_FILESYSTEMTYPE_EXTERNAL) 69 if (file_system_type_ != PP_FILESYSTEMTYPE_EXTERNAL)
103 return PP_ERROR_FAILED; 70 return PP_ERROR_FAILED;
104 if (!plugin_delegate->AsyncOpenFile( 71 if (!plugin_delegate->AsyncOpenFile(
105 file_ref->GetSystemPath(), flags, 72 file_ref->GetSystemPath(), flags,
106 base::Bind(&PPB_FileIO_Impl::AsyncOpenFileCallback, 73 base::Bind(&PPB_FileIO_Impl::ExecutePlatformOpenFileCallback,
107 weak_factory_.GetWeakPtr()))) 74 weak_factory_.GetWeakPtr())))
108 return PP_ERROR_FAILED; 75 return PP_ERROR_FAILED;
109 } 76 }
110 77
111 RegisterCallback(OPERATION_EXCLUSIVE, callback, NULL); 78 RegisterCallback(OPERATION_EXCLUSIVE, callback, NULL, NULL);
112 return PP_OK_COMPLETIONPENDING; 79 return PP_OK_COMPLETIONPENDING;
113 } 80 }
114 81
115 int32_t PPB_FileIO_Impl::Query(PP_FileInfo* info, 82 int32_t PPB_FileIO_Impl::QueryValidated(PP_FileInfo* info,
116 PP_CompletionCallback callback) { 83 PP_CompletionCallback callback) {
117 int32_t rv = CommonCallValidation(true, OPERATION_EXCLUSIVE, callback); 84 PluginDelegate* plugin_delegate = GetPluginDelegate();
118 if (rv != PP_OK)
119 return rv;
120
121 if (!info)
122 return PP_ERROR_BADARGUMENT;
123
124 DCHECK(!info_); // If |info_|, a callback should be pending (caught above).
125 info_ = info;
126
127 PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this);
128 if (!plugin_delegate) 85 if (!plugin_delegate)
129 return PP_ERROR_FAILED; 86 return PP_ERROR_FAILED;
130 87
131 if (!base::FileUtilProxy::GetFileInfoFromPlatformFile( 88 if (!base::FileUtilProxy::GetFileInfoFromPlatformFile(
132 plugin_delegate->GetFileThreadMessageLoopProxy(), file_, 89 plugin_delegate->GetFileThreadMessageLoopProxy(), file_,
133 base::Bind(&PPB_FileIO_Impl::QueryInfoCallback, 90 base::Bind(&PPB_FileIO_Impl::ExecutePlatformQueryCallback,
134 weak_factory_.GetWeakPtr()))) 91 weak_factory_.GetWeakPtr())))
135 return PP_ERROR_FAILED; 92 return PP_ERROR_FAILED;
136 93
137 RegisterCallback(OPERATION_EXCLUSIVE, callback, NULL); 94 RegisterCallback(OPERATION_EXCLUSIVE, callback, NULL, info);
138 return PP_OK_COMPLETIONPENDING; 95 return PP_OK_COMPLETIONPENDING;
139 } 96 }
140 97
141 int32_t PPB_FileIO_Impl::Touch(PP_Time last_access_time, 98 int32_t PPB_FileIO_Impl::TouchValidated(PP_Time last_access_time,
142 PP_Time last_modified_time, 99 PP_Time last_modified_time,
143 PP_CompletionCallback callback) { 100 PP_CompletionCallback callback) {
144 int32_t rv = CommonCallValidation(true, OPERATION_EXCLUSIVE, callback); 101 PluginDelegate* plugin_delegate = GetPluginDelegate();
145 if (rv != PP_OK)
146 return rv;
147
148 PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this);
149 if (!plugin_delegate) 102 if (!plugin_delegate)
150 return PP_ERROR_FAILED; 103 return PP_ERROR_FAILED;
151 104
152 if (!base::FileUtilProxy::Touch( 105 if (!base::FileUtilProxy::Touch(
153 plugin_delegate->GetFileThreadMessageLoopProxy(), 106 plugin_delegate->GetFileThreadMessageLoopProxy(),
154 file_, PPTimeToTime(last_access_time), 107 file_, PPTimeToTime(last_access_time),
155 PPTimeToTime(last_modified_time), 108 PPTimeToTime(last_modified_time),
156 base::Bind(&PPB_FileIO_Impl::StatusCallback, 109 base::Bind(&PPB_FileIO_Impl::ExecutePlatformGeneralCallback,
157 weak_factory_.GetWeakPtr()))) 110 weak_factory_.GetWeakPtr())))
158 return PP_ERROR_FAILED; 111 return PP_ERROR_FAILED;
159 112
160 RegisterCallback(OPERATION_EXCLUSIVE, callback, NULL); 113 RegisterCallback(OPERATION_EXCLUSIVE, callback, NULL, NULL);
161 return PP_OK_COMPLETIONPENDING; 114 return PP_OK_COMPLETIONPENDING;
162 } 115 }
163 116
164 int32_t PPB_FileIO_Impl::Read(int64_t offset, 117 int32_t PPB_FileIO_Impl::ReadValidated(int64_t offset,
165 char* buffer, 118 char* buffer,
166 int32_t bytes_to_read, 119 int32_t bytes_to_read,
167 PP_CompletionCallback callback) { 120 PP_CompletionCallback callback) {
168 int32_t rv = CommonCallValidation(true, OPERATION_READ, callback); 121 PluginDelegate* plugin_delegate = GetPluginDelegate();
169 if (rv != PP_OK)
170 return rv;
171
172 PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this);
173 if (!plugin_delegate) 122 if (!plugin_delegate)
174 return PP_ERROR_FAILED; 123 return PP_ERROR_FAILED;
175 124
176 if (!base::FileUtilProxy::Read( 125 if (!base::FileUtilProxy::Read(
177 plugin_delegate->GetFileThreadMessageLoopProxy(), file_, offset, 126 plugin_delegate->GetFileThreadMessageLoopProxy(), file_, offset,
178 bytes_to_read, 127 bytes_to_read,
179 base::Bind(&PPB_FileIO_Impl::ReadCallback, 128 base::Bind(&PPB_FileIO_Impl::ExecutePlatformReadCallback,
180 weak_factory_.GetWeakPtr()))) 129 weak_factory_.GetWeakPtr())))
181 return PP_ERROR_FAILED; 130 return PP_ERROR_FAILED;
182 131
183 RegisterCallback(OPERATION_READ, callback, buffer); 132 RegisterCallback(OPERATION_READ, callback, buffer, NULL);
184 return PP_OK_COMPLETIONPENDING; 133 return PP_OK_COMPLETIONPENDING;
185 } 134 }
186 135
187 int32_t PPB_FileIO_Impl::Write(int64_t offset, 136 int32_t PPB_FileIO_Impl::WriteValidated(int64_t offset,
188 const char* buffer, 137 const char* buffer,
189 int32_t bytes_to_write, 138 int32_t bytes_to_write,
190 PP_CompletionCallback callback) { 139 PP_CompletionCallback callback) {
191 int32_t rv = CommonCallValidation(true, OPERATION_WRITE, callback); 140 PluginDelegate* plugin_delegate = GetPluginDelegate();
192 if (rv != PP_OK)
193 return rv;
194
195 PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this);
196 if (!plugin_delegate) 141 if (!plugin_delegate)
197 return PP_ERROR_FAILED; 142 return PP_ERROR_FAILED;
198 143
199 if (quota_file_io_.get()) { 144 if (quota_file_io_.get()) {
200 if (!quota_file_io_->Write( 145 if (!quota_file_io_->Write(
201 offset, buffer, bytes_to_write, 146 offset, buffer, bytes_to_write,
202 base::Bind(&PPB_FileIO_Impl::WriteCallback, 147 base::Bind(&PPB_FileIO_Impl::ExecutePlatformWriteCallback,
203 weak_factory_.GetWeakPtr()))) 148 weak_factory_.GetWeakPtr())))
204 return PP_ERROR_FAILED; 149 return PP_ERROR_FAILED;
205 } else { 150 } else {
206 if (!base::FileUtilProxy::Write( 151 if (!base::FileUtilProxy::Write(
207 plugin_delegate->GetFileThreadMessageLoopProxy(), file_, offset, 152 plugin_delegate->GetFileThreadMessageLoopProxy(), file_, offset,
208 buffer, bytes_to_write, 153 buffer, bytes_to_write,
209 base::Bind(&PPB_FileIO_Impl::WriteCallback, 154 base::Bind(&PPB_FileIO_Impl::ExecutePlatformWriteCallback,
210 weak_factory_.GetWeakPtr()))) 155 weak_factory_.GetWeakPtr())))
211 return PP_ERROR_FAILED; 156 return PP_ERROR_FAILED;
212 } 157 }
213 158
214 RegisterCallback(OPERATION_WRITE, callback, NULL); 159 RegisterCallback(OPERATION_WRITE, callback, NULL, NULL);
215 return PP_OK_COMPLETIONPENDING; 160 return PP_OK_COMPLETIONPENDING;
216 } 161 }
217 162
218 int32_t PPB_FileIO_Impl::SetLength(int64_t length, 163 int32_t PPB_FileIO_Impl::SetLengthValidated(int64_t length,
219 PP_CompletionCallback callback) { 164 PP_CompletionCallback callback) {
220 int32_t rv = CommonCallValidation(true, OPERATION_EXCLUSIVE, callback); 165 PluginDelegate* plugin_delegate = GetPluginDelegate();
221 if (rv != PP_OK)
222 return rv;
223
224 PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this);
225 if (!plugin_delegate) 166 if (!plugin_delegate)
226 return PP_ERROR_FAILED; 167 return PP_ERROR_FAILED;
227 168
228 if (quota_file_io_.get()) { 169 if (quota_file_io_.get()) {
229 if (!quota_file_io_->SetLength( 170 if (!quota_file_io_->SetLength(
230 length, 171 length,
231 base::Bind(&PPB_FileIO_Impl::StatusCallback, 172 base::Bind(&PPB_FileIO_Impl::ExecutePlatformGeneralCallback,
232 weak_factory_.GetWeakPtr()))) 173 weak_factory_.GetWeakPtr())))
233 return PP_ERROR_FAILED; 174 return PP_ERROR_FAILED;
234 } else { 175 } else {
235 if (!base::FileUtilProxy::Truncate( 176 if (!base::FileUtilProxy::Truncate(
236 plugin_delegate->GetFileThreadMessageLoopProxy(), file_, length, 177 plugin_delegate->GetFileThreadMessageLoopProxy(), file_, length,
237 base::Bind(&PPB_FileIO_Impl::StatusCallback, 178 base::Bind(&PPB_FileIO_Impl::ExecutePlatformGeneralCallback,
238 weak_factory_.GetWeakPtr()))) 179 weak_factory_.GetWeakPtr())))
239 return PP_ERROR_FAILED; 180 return PP_ERROR_FAILED;
240 } 181 }
241 182
242 RegisterCallback(OPERATION_EXCLUSIVE, callback, NULL); 183 RegisterCallback(OPERATION_EXCLUSIVE, callback, NULL, NULL);
243 return PP_OK_COMPLETIONPENDING; 184 return PP_OK_COMPLETIONPENDING;
244 } 185 }
245 186
246 int32_t PPB_FileIO_Impl::Flush(PP_CompletionCallback callback) { 187 int32_t PPB_FileIO_Impl::FlushValidated(PP_CompletionCallback callback) {
247 int32_t rv = CommonCallValidation(true, OPERATION_EXCLUSIVE, callback); 188 PluginDelegate* plugin_delegate = GetPluginDelegate();
248 if (rv != PP_OK)
249 return rv;
250
251 PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this);
252 if (!plugin_delegate) 189 if (!plugin_delegate)
253 return PP_ERROR_FAILED; 190 return PP_ERROR_FAILED;
254 191
255 if (!base::FileUtilProxy::Flush( 192 if (!base::FileUtilProxy::Flush(
256 plugin_delegate->GetFileThreadMessageLoopProxy(), file_, 193 plugin_delegate->GetFileThreadMessageLoopProxy(), file_,
257 base::Bind(&PPB_FileIO_Impl::StatusCallback, 194 base::Bind(&PPB_FileIO_Impl::ExecutePlatformGeneralCallback,
258 weak_factory_.GetWeakPtr()))) 195 weak_factory_.GetWeakPtr())))
259 return PP_ERROR_FAILED; 196 return PP_ERROR_FAILED;
260 197
261 RegisterCallback(OPERATION_EXCLUSIVE, callback, NULL); 198 RegisterCallback(OPERATION_EXCLUSIVE, callback, NULL, NULL);
262 return PP_OK_COMPLETIONPENDING; 199 return PP_OK_COMPLETIONPENDING;
263 } 200 }
264 201
265 void PPB_FileIO_Impl::Close() { 202 void PPB_FileIO_Impl::Close() {
266 PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this); 203 PluginDelegate* plugin_delegate = GetPluginDelegate();
267 if (file_ != base::kInvalidPlatformFileValue && plugin_delegate) { 204 if (file_ != base::kInvalidPlatformFileValue && plugin_delegate) {
268 base::FileUtilProxy::Close( 205 base::FileUtilProxy::Close(
269 plugin_delegate->GetFileThreadMessageLoopProxy(), file_, 206 plugin_delegate->GetFileThreadMessageLoopProxy(), file_,
270 base::FileUtilProxy::StatusCallback()); 207 base::FileUtilProxy::StatusCallback());
271 file_ = base::kInvalidPlatformFileValue; 208 file_ = base::kInvalidPlatformFileValue;
272 quota_file_io_.reset(); 209 quota_file_io_.reset();
273 } 210 }
274 } 211 }
275 212
276 int32_t PPB_FileIO_Impl::GetOSFileDescriptor() { 213 int32_t PPB_FileIO_Impl::GetOSFileDescriptor() {
(...skipping 11 matching lines...) Expand all
288 PP_CompletionCallback callback) { 225 PP_CompletionCallback callback) {
289 int32_t rv = CommonCallValidation(true, OPERATION_EXCLUSIVE, callback); 226 int32_t rv = CommonCallValidation(true, OPERATION_EXCLUSIVE, callback);
290 if (rv != PP_OK) 227 if (rv != PP_OK)
291 return rv; 228 return rv;
292 229
293 if (!quota_file_io_.get()) 230 if (!quota_file_io_.get())
294 return PP_OK; 231 return PP_OK;
295 232
296 if (!quota_file_io_->WillWrite( 233 if (!quota_file_io_->WillWrite(
297 offset, bytes_to_write, 234 offset, bytes_to_write,
298 base::Bind(&PPB_FileIO_Impl::WillWriteCallback, 235 base::Bind(&PPB_FileIO_Impl::ExecutePlatformWillWriteCallback,
299 weak_factory_.GetWeakPtr()))) 236 weak_factory_.GetWeakPtr())))
300 return PP_ERROR_FAILED; 237 return PP_ERROR_FAILED;
301 238
302 RegisterCallback(OPERATION_EXCLUSIVE, callback, NULL); 239 RegisterCallback(OPERATION_EXCLUSIVE, callback, NULL, NULL);
303 return PP_OK_COMPLETIONPENDING; 240 return PP_OK_COMPLETIONPENDING;
304 } 241 }
305 242
306 int32_t PPB_FileIO_Impl::WillSetLength(int64_t length, 243 int32_t PPB_FileIO_Impl::WillSetLength(int64_t length,
307 PP_CompletionCallback callback) { 244 PP_CompletionCallback callback) {
308 int32_t rv = CommonCallValidation(true, OPERATION_EXCLUSIVE, callback); 245 int32_t rv = CommonCallValidation(true, OPERATION_EXCLUSIVE, callback);
309 if (rv != PP_OK) 246 if (rv != PP_OK)
310 return rv; 247 return rv;
311 248
312 if (!quota_file_io_.get()) 249 if (!quota_file_io_.get())
313 return PP_OK; 250 return PP_OK;
314 251
315 if (!quota_file_io_->WillSetLength( 252 if (!quota_file_io_->WillSetLength(
316 length, 253 length,
317 base::Bind(&PPB_FileIO_Impl::StatusCallback, 254 base::Bind(&PPB_FileIO_Impl::ExecutePlatformGeneralCallback,
318 weak_factory_.GetWeakPtr()))) 255 weak_factory_.GetWeakPtr())))
319 return PP_ERROR_FAILED; 256 return PP_ERROR_FAILED;
320 257
321 RegisterCallback(OPERATION_EXCLUSIVE, callback, NULL); 258 RegisterCallback(OPERATION_EXCLUSIVE, callback, NULL, NULL);
322 return PP_OK_COMPLETIONPENDING; 259 return PP_OK_COMPLETIONPENDING;
323 } 260 }
324 261
325 int32_t PPB_FileIO_Impl::CommonCallValidation(bool should_be_open, 262 PluginDelegate* PPB_FileIO_Impl::GetPluginDelegate() {
326 OperationType new_op, 263 return ResourceHelper::GetPluginDelegate(this);
327 PP_CompletionCallback callback) {
328 // Only asynchronous operation is supported.
329 if (!callback.func)
330 return PP_ERROR_BLOCKS_MAIN_THREAD;
331
332 if (should_be_open) {
333 if (file_ == base::kInvalidPlatformFileValue)
334 return PP_ERROR_FAILED;
335 } else {
336 if (file_ != base::kInvalidPlatformFileValue)
337 return PP_ERROR_FAILED;
338 }
339
340 if (pending_op_ != OPERATION_NONE &&
341 (pending_op_ != new_op || pending_op_ == OPERATION_EXCLUSIVE)) {
342 return PP_ERROR_INPROGRESS;
343 }
344
345 return PP_OK;
346 } 264 }
347 265
348 void PPB_FileIO_Impl::RegisterCallback(OperationType op, 266 void PPB_FileIO_Impl::ExecutePlatformGeneralCallback(
349 PP_CompletionCallback callback, 267 base::PlatformFileError error_code) {
350 char* read_buffer) { 268 ExecuteGeneralCallback(::ppapi::PlatformFileErrorToPepperError(error_code));
351 DCHECK(callback.func);
352 DCHECK(pending_op_ == OPERATION_NONE ||
353 (pending_op_ != OPERATION_EXCLUSIVE && pending_op_ == op));
354
355 PluginModule* plugin_module = ResourceHelper::GetPluginModule(this);
356 if (!plugin_module)
357 return;
358
359 CallbackEntry entry;
360 entry.callback = new TrackedCompletionCallback(
361 plugin_module->GetCallbackTracker(), pp_resource(), callback);
362 entry.read_buffer = read_buffer;
363
364 callbacks_.push(entry);
365 pending_op_ = op;
366 } 269 }
367 270
368 void PPB_FileIO_Impl::RunAndRemoveFirstPendingCallback(int32_t result) { 271 void PPB_FileIO_Impl::ExecutePlatformOpenFileCallback(
369 DCHECK(!callbacks_.empty());
370
371 CallbackEntry front = callbacks_.front();
372 callbacks_.pop();
373 if (callbacks_.empty())
374 pending_op_ = OPERATION_NONE;
375
376 front.callback->Run(result); // Will complete abortively if necessary.
377 }
378
379 void PPB_FileIO_Impl::StatusCallback(base::PlatformFileError error_code) {
380 if (pending_op_ != OPERATION_EXCLUSIVE || callbacks_.empty()) {
381 NOTREACHED();
382 return;
383 }
384
385 RunAndRemoveFirstPendingCallback(PlatformFileErrorToPepperError(error_code));
386 }
387
388 void PPB_FileIO_Impl::AsyncOpenFileCallback(
389 base::PlatformFileError error_code, 272 base::PlatformFileError error_code,
390 base::PassPlatformFile file) { 273 base::PassPlatformFile file) {
391 if (pending_op_ != OPERATION_EXCLUSIVE || callbacks_.empty()) {
392 NOTREACHED();
393 return;
394 }
395
396 DCHECK(file_ == base::kInvalidPlatformFileValue); 274 DCHECK(file_ == base::kInvalidPlatformFileValue);
397 file_ = file.ReleaseValue(); 275 file_ = file.ReleaseValue();
398 276
399 DCHECK(!quota_file_io_.get()); 277 DCHECK(!quota_file_io_.get());
400 if (file_ != base::kInvalidPlatformFileValue && 278 if (file_ != base::kInvalidPlatformFileValue &&
401 (file_system_type_ == PP_FILESYSTEMTYPE_LOCALTEMPORARY || 279 (file_system_type_ == PP_FILESYSTEMTYPE_LOCALTEMPORARY ||
402 file_system_type_ == PP_FILESYSTEMTYPE_LOCALPERSISTENT)) { 280 file_system_type_ == PP_FILESYSTEMTYPE_LOCALPERSISTENT)) {
403 quota_file_io_.reset(new QuotaFileIO( 281 quota_file_io_.reset(new QuotaFileIO(
404 pp_instance(), file_, file_system_url_, file_system_type_)); 282 pp_instance(), file_, file_system_url_, file_system_type_));
405 } 283 }
406 284
407 RunAndRemoveFirstPendingCallback(PlatformFileErrorToPepperError(error_code)); 285 ExecuteOpenFileCallback(::ppapi::PlatformFileErrorToPepperError(error_code));
408 } 286 }
409 287
410 void PPB_FileIO_Impl::QueryInfoCallback( 288 void PPB_FileIO_Impl::ExecutePlatformQueryCallback(
411 base::PlatformFileError error_code, 289 base::PlatformFileError error_code,
412 const base::PlatformFileInfo& file_info) { 290 const base::PlatformFileInfo& file_info) {
291 PP_FileInfo pp_info;
292 pp_info.size = file_info.size;
293 pp_info.creation_time = TimeToPPTime(file_info.creation_time);
294 pp_info.last_access_time = TimeToPPTime(file_info.last_accessed);
295 pp_info.last_modified_time = TimeToPPTime(file_info.last_modified);
296 pp_info.system_type = file_system_type_;
297 if (file_info.is_directory)
298 pp_info.type = PP_FILETYPE_DIRECTORY;
299 else
300 pp_info.type = PP_FILETYPE_REGULAR;
301
302 ExecuteQueryCallback(::ppapi::PlatformFileErrorToPepperError(error_code),
303 pp_info);
304 }
305
306 void PPB_FileIO_Impl::ExecutePlatformReadCallback(
307 base::PlatformFileError error_code,
308 const char* data, int bytes_read) {
309 // Map the error code, OK getting mapped to the # of bytes read.
310 int32_t pp_result = ::ppapi::PlatformFileErrorToPepperError(error_code);
311 pp_result = pp_result == PP_OK ? bytes_read : pp_result;
312 ExecuteReadCallback(pp_result, data);
313 }
314
315 void PPB_FileIO_Impl::ExecutePlatformWriteCallback(
316 base::PlatformFileError error_code,
317 int bytes_written) {
318 int32_t pp_result = ::ppapi::PlatformFileErrorToPepperError(error_code);
319 ExecuteGeneralCallback(pp_result == PP_OK ? bytes_written : pp_result);
320 }
321
322 void PPB_FileIO_Impl::ExecutePlatformWillWriteCallback(
323 base::PlatformFileError error_code,
324 int bytes_written) {
413 if (pending_op_ != OPERATION_EXCLUSIVE || callbacks_.empty()) { 325 if (pending_op_ != OPERATION_EXCLUSIVE || callbacks_.empty()) {
414 NOTREACHED(); 326 NOTREACHED();
415 return; 327 return;
416 }
417
418 DCHECK(info_);
419 if (error_code == base::PLATFORM_FILE_OK) {
420 info_->size = file_info.size;
421 info_->creation_time = TimeToPPTime(file_info.creation_time);
422 info_->last_access_time = TimeToPPTime(file_info.last_accessed);
423 info_->last_modified_time = TimeToPPTime(file_info.last_modified);
424 info_->system_type = file_system_type_;
425 if (file_info.is_directory)
426 info_->type = PP_FILETYPE_DIRECTORY;
427 else
428 info_->type = PP_FILETYPE_REGULAR;
429 }
430 info_ = NULL;
431 RunAndRemoveFirstPendingCallback(PlatformFileErrorToPepperError(error_code));
432 }
433
434 void PPB_FileIO_Impl::ReadCallback(base::PlatformFileError error_code,
435 const char* data, int bytes_read) {
436 if (pending_op_ != OPERATION_READ || callbacks_.empty()) {
437 NOTREACHED();
438 return;
439 }
440
441 char* read_buffer = callbacks_.front().read_buffer;
442 DCHECK(data);
443 DCHECK(read_buffer);
444
445 int rv;
446 if (error_code == base::PLATFORM_FILE_OK) {
447 rv = bytes_read;
448 if (file_ != base::kInvalidPlatformFileValue)
449 memcpy(read_buffer, data, bytes_read);
450 } else {
451 rv = PlatformFileErrorToPepperError(error_code);
452 }
453
454 RunAndRemoveFirstPendingCallback(rv);
455 }
456
457 void PPB_FileIO_Impl::WriteCallback(base::PlatformFileError error_code,
458 int bytes_written) {
459 if (pending_op_ != OPERATION_WRITE || callbacks_.empty()) {
460 NOTREACHED();
461 return;
462 }
463
464 if (error_code != base::PLATFORM_FILE_OK) {
465 RunAndRemoveFirstPendingCallback(
466 PlatformFileErrorToPepperError(error_code));
467 } else {
468 RunAndRemoveFirstPendingCallback(bytes_written);
469 }
470 }
471
472 void PPB_FileIO_Impl::WillWriteCallback(base::PlatformFileError error_code,
473 int bytes_written) {
474 if (pending_op_ != OPERATION_EXCLUSIVE || callbacks_.empty()) {
475 NOTREACHED();
476 return;
477 } 328 }
478 329
479 if (error_code != base::PLATFORM_FILE_OK) { 330 if (error_code != base::PLATFORM_FILE_OK) {
480 RunAndRemoveFirstPendingCallback( 331 RunAndRemoveFirstPendingCallback(
481 PlatformFileErrorToPepperError(error_code)); 332 ::ppapi::PlatformFileErrorToPepperError(error_code));
482 } else { 333 } else {
483 RunAndRemoveFirstPendingCallback(bytes_written); 334 RunAndRemoveFirstPendingCallback(bytes_written);
484 } 335 }
485 } 336 }
486 337
487 } // namespace ppapi 338 } // namespace ppapi
488 } // namespace webkit 339 } // namespace webkit
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698