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

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

Issue 6228004: Fix Pepper File IO callbacks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased Created 9 years, 11 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
OLDNEW
1 // Copyright (c) 2010 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/callback.h" 7 #include "base/callback.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/file_util_proxy.h" 9 #include "base/file_util_proxy.h"
10 #include "base/message_loop_proxy.h" 10 #include "base/message_loop_proxy.h"
11 #include "base/platform_file.h" 11 #include "base/platform_file.h"
(...skipping 24 matching lines...) Expand all
36 } 36 }
37 37
38 PP_Bool IsFileIO(PP_Resource resource) { 38 PP_Bool IsFileIO(PP_Resource resource) {
39 return BoolToPPBool(!!Resource::GetAs<PPB_FileIO_Impl>(resource)); 39 return BoolToPPBool(!!Resource::GetAs<PPB_FileIO_Impl>(resource));
40 } 40 }
41 41
42 int32_t Open(PP_Resource file_io_id, 42 int32_t Open(PP_Resource file_io_id,
43 PP_Resource file_ref_id, 43 PP_Resource file_ref_id,
44 int32_t open_flags, 44 int32_t open_flags,
45 PP_CompletionCallback callback) { 45 PP_CompletionCallback callback) {
46 scoped_refptr<PPB_FileIO_Impl> file_io(Resource::GetAs<PPB_FileIO_Impl>(file_i o_id)); 46 scoped_refptr<PPB_FileIO_Impl>
47 file_io(Resource::GetAs<PPB_FileIO_Impl>(file_io_id));
47 if (!file_io) 48 if (!file_io)
48 return PP_ERROR_BADRESOURCE; 49 return PP_ERROR_BADRESOURCE;
49 50
50 scoped_refptr<PPB_FileRef_Impl> file_ref( 51 scoped_refptr<PPB_FileRef_Impl> file_ref(
51 Resource::GetAs<PPB_FileRef_Impl>(file_ref_id)); 52 Resource::GetAs<PPB_FileRef_Impl>(file_ref_id));
52 if (!file_ref) 53 if (!file_ref)
53 return PP_ERROR_BADRESOURCE; 54 return PP_ERROR_BADRESOURCE;
54 55
55 return file_io->Open(file_ref, open_flags, callback); 56 return file_io->Open(file_ref, open_flags, callback);
56 } 57 }
57 58
58 int32_t Query(PP_Resource file_io_id, 59 int32_t Query(PP_Resource file_io_id,
59 PP_FileInfo_Dev* info, 60 PP_FileInfo_Dev* info,
60 PP_CompletionCallback callback) { 61 PP_CompletionCallback callback) {
61 scoped_refptr<PPB_FileIO_Impl> file_io(Resource::GetAs<PPB_FileIO_Impl>(file_i o_id)); 62 scoped_refptr<PPB_FileIO_Impl>
63 file_io(Resource::GetAs<PPB_FileIO_Impl>(file_io_id));
62 if (!file_io) 64 if (!file_io)
63 return PP_ERROR_BADRESOURCE; 65 return PP_ERROR_BADRESOURCE;
64 return file_io->Query(info, callback); 66 return file_io->Query(info, callback);
65 } 67 }
66 68
67 int32_t Touch(PP_Resource file_io_id, 69 int32_t Touch(PP_Resource file_io_id,
68 PP_Time last_access_time, 70 PP_Time last_access_time,
69 PP_Time last_modified_time, 71 PP_Time last_modified_time,
70 PP_CompletionCallback callback) { 72 PP_CompletionCallback callback) {
71 scoped_refptr<PPB_FileIO_Impl> file_io(Resource::GetAs<PPB_FileIO_Impl>(file_i o_id)); 73 scoped_refptr<PPB_FileIO_Impl>
74 file_io(Resource::GetAs<PPB_FileIO_Impl>(file_io_id));
72 if (!file_io) 75 if (!file_io)
73 return PP_ERROR_BADRESOURCE; 76 return PP_ERROR_BADRESOURCE;
74 return file_io->Touch(last_access_time, last_modified_time, callback); 77 return file_io->Touch(last_access_time, last_modified_time, callback);
75 } 78 }
76 79
77 int32_t Read(PP_Resource file_io_id, 80 int32_t Read(PP_Resource file_io_id,
78 int64_t offset, 81 int64_t offset,
79 char* buffer, 82 char* buffer,
80 int32_t bytes_to_read, 83 int32_t bytes_to_read,
81 PP_CompletionCallback callback) { 84 PP_CompletionCallback callback) {
82 scoped_refptr<PPB_FileIO_Impl> file_io(Resource::GetAs<PPB_FileIO_Impl>(file_i o_id)); 85 scoped_refptr<PPB_FileIO_Impl>
86 file_io(Resource::GetAs<PPB_FileIO_Impl>(file_io_id));
83 if (!file_io) 87 if (!file_io)
84 return PP_ERROR_BADRESOURCE; 88 return PP_ERROR_BADRESOURCE;
85 return file_io->Read(offset, buffer, bytes_to_read, callback); 89 return file_io->Read(offset, buffer, bytes_to_read, callback);
86 } 90 }
87 91
88 int32_t Write(PP_Resource file_io_id, 92 int32_t Write(PP_Resource file_io_id,
89 int64_t offset, 93 int64_t offset,
90 const char* buffer, 94 const char* buffer,
91 int32_t bytes_to_write, 95 int32_t bytes_to_write,
92 PP_CompletionCallback callback) { 96 PP_CompletionCallback callback) {
93 scoped_refptr<PPB_FileIO_Impl> file_io(Resource::GetAs<PPB_FileIO_Impl>(file_i o_id)); 97 scoped_refptr<PPB_FileIO_Impl>
98 file_io(Resource::GetAs<PPB_FileIO_Impl>(file_io_id));
94 if (!file_io) 99 if (!file_io)
95 return PP_ERROR_BADRESOURCE; 100 return PP_ERROR_BADRESOURCE;
96 return file_io->Write(offset, buffer, bytes_to_write, callback); 101 return file_io->Write(offset, buffer, bytes_to_write, callback);
97 } 102 }
98 103
99 int32_t SetLength(PP_Resource file_io_id, 104 int32_t SetLength(PP_Resource file_io_id,
100 int64_t length, 105 int64_t length,
101 PP_CompletionCallback callback) { 106 PP_CompletionCallback callback) {
102 scoped_refptr<PPB_FileIO_Impl> file_io(Resource::GetAs<PPB_FileIO_Impl>(file_i o_id)); 107 scoped_refptr<PPB_FileIO_Impl>
108 file_io(Resource::GetAs<PPB_FileIO_Impl>(file_io_id));
103 if (!file_io) 109 if (!file_io)
104 return PP_ERROR_BADRESOURCE; 110 return PP_ERROR_BADRESOURCE;
105 return file_io->SetLength(length, callback); 111 return file_io->SetLength(length, callback);
106 } 112 }
107 113
108 int32_t Flush(PP_Resource file_io_id, 114 int32_t Flush(PP_Resource file_io_id,
109 PP_CompletionCallback callback) { 115 PP_CompletionCallback callback) {
110 scoped_refptr<PPB_FileIO_Impl> file_io(Resource::GetAs<PPB_FileIO_Impl>(file_i o_id)); 116 scoped_refptr<PPB_FileIO_Impl>
117 file_io(Resource::GetAs<PPB_FileIO_Impl>(file_io_id));
111 if (!file_io) 118 if (!file_io)
112 return PP_ERROR_BADRESOURCE; 119 return PP_ERROR_BADRESOURCE;
113 return file_io->Flush(callback); 120 return file_io->Flush(callback);
114 } 121 }
115 122
116 void Close(PP_Resource file_io_id) { 123 void Close(PP_Resource file_io_id) {
117 scoped_refptr<PPB_FileIO_Impl> file_io(Resource::GetAs<PPB_FileIO_Impl>(file_i o_id)); 124 scoped_refptr<PPB_FileIO_Impl>
125 file_io(Resource::GetAs<PPB_FileIO_Impl>(file_io_id));
118 if (!file_io) 126 if (!file_io)
119 return; 127 return;
120 file_io->Close(); 128 file_io->Close();
121 } 129 }
122 130
123 const PPB_FileIO_Dev ppb_fileio = { 131 const PPB_FileIO_Dev ppb_fileio = {
124 &Create, 132 &Create,
125 &IsFileIO, 133 &IsFileIO,
126 &Open, 134 &Open,
127 &Query, 135 &Query,
128 &Touch, 136 &Touch,
129 &Read, 137 &Read,
130 &Write, 138 &Write,
131 &SetLength, 139 &SetLength,
132 &Flush, 140 &Flush,
133 &Close 141 &Close
134 }; 142 };
135 143
136 int32_t GetOSFileDescriptor(PP_Resource file_io_id) { 144 int32_t GetOSFileDescriptor(PP_Resource file_io_id) {
137 scoped_refptr<PPB_FileIO_Impl> file_io(Resource::GetAs<PPB_FileIO_Impl>(file_i o_id)); 145 scoped_refptr<PPB_FileIO_Impl>
146 file_io(Resource::GetAs<PPB_FileIO_Impl>(file_io_id));
138 if (!file_io) 147 if (!file_io)
139 return PP_ERROR_BADRESOURCE; 148 return PP_ERROR_BADRESOURCE;
140 return file_io->GetOSFileDescriptor(); 149 return file_io->GetOSFileDescriptor();
141 } 150 }
142 151
143 int32_t WillWrite(PP_Resource file_io_id, 152 int32_t WillWrite(PP_Resource file_io_id,
144 int64_t offset, 153 int64_t offset,
145 int32_t bytes_to_write, 154 int32_t bytes_to_write,
146 PP_CompletionCallback callback) { 155 PP_CompletionCallback callback) {
147 scoped_refptr<PPB_FileIO_Impl> file_io(Resource::GetAs<PPB_FileIO_Impl>(file_i o_id)); 156 scoped_refptr<PPB_FileIO_Impl>
157 file_io(Resource::GetAs<PPB_FileIO_Impl>(file_io_id));
148 if (!file_io) 158 if (!file_io)
149 return PP_ERROR_BADRESOURCE; 159 return PP_ERROR_BADRESOURCE;
150 return file_io->WillWrite(offset, bytes_to_write, callback); 160 return file_io->WillWrite(offset, bytes_to_write, callback);
151 } 161 }
152 162
153 int32_t WillSetLength(PP_Resource file_io_id, 163 int32_t WillSetLength(PP_Resource file_io_id,
154 int64_t length, 164 int64_t length,
155 PP_CompletionCallback callback) { 165 PP_CompletionCallback callback) {
156 scoped_refptr<PPB_FileIO_Impl> file_io(Resource::GetAs<PPB_FileIO_Impl>(file_i o_id)); 166 scoped_refptr<PPB_FileIO_Impl>
167 file_io(Resource::GetAs<PPB_FileIO_Impl>(file_io_id));
157 if (!file_io) 168 if (!file_io)
158 return PP_ERROR_BADRESOURCE; 169 return PP_ERROR_BADRESOURCE;
159 return file_io->WillSetLength(length, callback); 170 return file_io->WillSetLength(length, callback);
160 } 171 }
161 172
162 const PPB_FileIOTrusted_Dev ppb_fileiotrusted = { 173 const PPB_FileIOTrusted_Dev ppb_fileiotrusted = {
163 &GetOSFileDescriptor, 174 &GetOSFileDescriptor,
164 &WillWrite, 175 &WillWrite,
165 &WillSetLength 176 &WillSetLength
166 }; 177 };
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 return &ppb_fileiotrusted; 223 return &ppb_fileiotrusted;
213 } 224 }
214 225
215 PPB_FileIO_Impl* PPB_FileIO_Impl::AsPPB_FileIO_Impl() { 226 PPB_FileIO_Impl* PPB_FileIO_Impl::AsPPB_FileIO_Impl() {
216 return this; 227 return this;
217 } 228 }
218 229
219 int32_t PPB_FileIO_Impl::Open(PPB_FileRef_Impl* file_ref, 230 int32_t PPB_FileIO_Impl::Open(PPB_FileRef_Impl* file_ref,
220 int32_t open_flags, 231 int32_t open_flags,
221 PP_CompletionCallback callback) { 232 PP_CompletionCallback callback) {
222 if (file_ != base::kInvalidPlatformFileValue) 233 int32_t rv = CommonCallValidation(false, callback);
223 return PP_ERROR_FAILED; 234 if (rv != PP_OK)
224 235 return rv;
225 DCHECK(!callback_.func);
226 callback_ = callback;
227 236
228 int flags = 0; 237 int flags = 0;
229 if (open_flags & PP_FILEOPENFLAG_READ) 238 if (open_flags & PP_FILEOPENFLAG_READ)
230 flags |= base::PLATFORM_FILE_READ; 239 flags |= base::PLATFORM_FILE_READ;
231 if (open_flags & PP_FILEOPENFLAG_WRITE) { 240 if (open_flags & PP_FILEOPENFLAG_WRITE) {
232 flags |= base::PLATFORM_FILE_WRITE; 241 flags |= base::PLATFORM_FILE_WRITE;
233 flags |= base::PLATFORM_FILE_WRITE_ATTRIBUTES; 242 flags |= base::PLATFORM_FILE_WRITE_ATTRIBUTES;
234 } 243 }
235 244
236 if (open_flags & PP_FILEOPENFLAG_TRUNCATE) { 245 if (open_flags & PP_FILEOPENFLAG_TRUNCATE) {
237 DCHECK(open_flags & PP_FILEOPENFLAG_WRITE); 246 DCHECK(open_flags & PP_FILEOPENFLAG_WRITE);
238 flags |= base::PLATFORM_FILE_TRUNCATE; 247 flags |= base::PLATFORM_FILE_TRUNCATE;
239 } else if (open_flags & PP_FILEOPENFLAG_CREATE) { 248 } else if (open_flags & PP_FILEOPENFLAG_CREATE) {
240 if (open_flags & PP_FILEOPENFLAG_EXCLUSIVE) 249 if (open_flags & PP_FILEOPENFLAG_EXCLUSIVE)
241 flags |= base::PLATFORM_FILE_CREATE; 250 flags |= base::PLATFORM_FILE_CREATE;
242 else 251 else
243 flags |= base::PLATFORM_FILE_OPEN_ALWAYS; 252 flags |= base::PLATFORM_FILE_OPEN_ALWAYS;
244 } else 253 } else {
245 flags |= base::PLATFORM_FILE_OPEN; 254 flags |= base::PLATFORM_FILE_OPEN;
255 }
246 256
247 file_system_type_ = file_ref->GetFileSystemType(); 257 file_system_type_ = file_ref->GetFileSystemType();
248 if (!delegate_->AsyncOpenFile( 258 if (!delegate_->AsyncOpenFile(
249 file_ref->GetSystemPath(), flags, 259 file_ref->GetSystemPath(), flags,
250 callback_factory_.NewCallback(&PPB_FileIO_Impl::AsyncOpenFileCallback) )) 260 callback_factory_.NewCallback(
261 &PPB_FileIO_Impl::AsyncOpenFileCallback)))
251 return PP_ERROR_FAILED; 262 return PP_ERROR_FAILED;
252 263
264 RegisterCallback(callback);
253 return PP_ERROR_WOULDBLOCK; 265 return PP_ERROR_WOULDBLOCK;
254 } 266 }
255 267
256 int32_t PPB_FileIO_Impl::Query(PP_FileInfo_Dev* info, 268 int32_t PPB_FileIO_Impl::Query(PP_FileInfo_Dev* info,
257 PP_CompletionCallback callback) { 269 PP_CompletionCallback callback) {
258 if (file_ == base::kInvalidPlatformFileValue) 270 int32_t rv = CommonCallValidation(true, callback);
259 return PP_ERROR_FAILED; 271 if (rv != PP_OK)
272 return rv;
260 273
261 DCHECK(!callback_.func); 274 if (!info)
262 callback_ = callback; 275 return PP_ERROR_BADARGUMENT;
263 276
264 DCHECK(!info_); 277 DCHECK(!info_); // If |info_|, a callback should be pending (caught above).
265 DCHECK(info);
266 info_ = info; 278 info_ = info;
267 279
268 if (!base::FileUtilProxy::GetFileInfoFromPlatformFile( 280 if (!base::FileUtilProxy::GetFileInfoFromPlatformFile(
269 delegate_->GetFileThreadMessageLoopProxy(), file_, 281 delegate_->GetFileThreadMessageLoopProxy(), file_,
270 callback_factory_.NewCallback(&PPB_FileIO_Impl::QueryInfoCallback))) 282 callback_factory_.NewCallback(&PPB_FileIO_Impl::QueryInfoCallback)))
271 return PP_ERROR_FAILED; 283 return PP_ERROR_FAILED;
272 284
285 RegisterCallback(callback);
273 return PP_ERROR_WOULDBLOCK; 286 return PP_ERROR_WOULDBLOCK;
274 } 287 }
275 288
276 int32_t PPB_FileIO_Impl::Touch(PP_Time last_access_time, 289 int32_t PPB_FileIO_Impl::Touch(PP_Time last_access_time,
277 PP_Time last_modified_time, 290 PP_Time last_modified_time,
278 PP_CompletionCallback callback) { 291 PP_CompletionCallback callback) {
279 if (file_ == base::kInvalidPlatformFileValue) 292 int32_t rv = CommonCallValidation(true, callback);
280 return PP_ERROR_FAILED; 293 if (rv != PP_OK)
281 294 return rv;
282 DCHECK(!callback_.func);
283 callback_ = callback;
284 295
285 if (!base::FileUtilProxy::Touch( 296 if (!base::FileUtilProxy::Touch(
286 delegate_->GetFileThreadMessageLoopProxy(), 297 delegate_->GetFileThreadMessageLoopProxy(),
287 file_, base::Time::FromDoubleT(last_access_time), 298 file_, base::Time::FromDoubleT(last_access_time),
288 base::Time::FromDoubleT(last_modified_time), 299 base::Time::FromDoubleT(last_modified_time),
289 callback_factory_.NewCallback(&PPB_FileIO_Impl::StatusCallback))) 300 callback_factory_.NewCallback(&PPB_FileIO_Impl::StatusCallback)))
290 return PP_ERROR_FAILED; 301 return PP_ERROR_FAILED;
291 302
303 RegisterCallback(callback);
292 return PP_ERROR_WOULDBLOCK; 304 return PP_ERROR_WOULDBLOCK;
293 } 305 }
294 306
295 int32_t PPB_FileIO_Impl::Read(int64_t offset, 307 int32_t PPB_FileIO_Impl::Read(int64_t offset,
296 char* buffer, 308 char* buffer,
297 int32_t bytes_to_read, 309 int32_t bytes_to_read,
298 PP_CompletionCallback callback) { 310 PP_CompletionCallback callback) {
299 if (file_ == base::kInvalidPlatformFileValue) 311 int32_t rv = CommonCallValidation(true, callback);
300 return PP_ERROR_FAILED; 312 if (rv != PP_OK)
301 313 return rv;
302 DCHECK(!callback_.func);
303 callback_ = callback;
304 314
305 if (!base::FileUtilProxy::Read( 315 if (!base::FileUtilProxy::Read(
306 delegate_->GetFileThreadMessageLoopProxy(), 316 delegate_->GetFileThreadMessageLoopProxy(),
307 file_, offset, buffer, bytes_to_read, 317 file_, offset, buffer, bytes_to_read,
308 callback_factory_.NewCallback(&PPB_FileIO_Impl::ReadWriteCallback))) 318 callback_factory_.NewCallback(&PPB_FileIO_Impl::ReadWriteCallback)))
309 return PP_ERROR_FAILED; 319 return PP_ERROR_FAILED;
310 320
321 RegisterCallback(callback);
311 return PP_ERROR_WOULDBLOCK; 322 return PP_ERROR_WOULDBLOCK;
312 } 323 }
313 324
314 int32_t PPB_FileIO_Impl::Write(int64_t offset, 325 int32_t PPB_FileIO_Impl::Write(int64_t offset,
315 const char* buffer, 326 const char* buffer,
316 int32_t bytes_to_write, 327 int32_t bytes_to_write,
317 PP_CompletionCallback callback) { 328 PP_CompletionCallback callback) {
318 if (file_ == base::kInvalidPlatformFileValue) 329 int32_t rv = CommonCallValidation(true, callback);
319 return PP_ERROR_FAILED; 330 if (rv != PP_OK)
320 331 return rv;
321 DCHECK(!callback_.func);
322 callback_ = callback;
323 332
324 if (!base::FileUtilProxy::Write( 333 if (!base::FileUtilProxy::Write(
325 delegate_->GetFileThreadMessageLoopProxy(), 334 delegate_->GetFileThreadMessageLoopProxy(),
326 file_, offset, buffer, bytes_to_write, 335 file_, offset, buffer, bytes_to_write,
327 callback_factory_.NewCallback(&PPB_FileIO_Impl::ReadWriteCallback))) 336 callback_factory_.NewCallback(&PPB_FileIO_Impl::ReadWriteCallback)))
328 return PP_ERROR_FAILED; 337 return PP_ERROR_FAILED;
329 338
339 RegisterCallback(callback);
330 return PP_ERROR_WOULDBLOCK; 340 return PP_ERROR_WOULDBLOCK;
331 } 341 }
332 342
333 int32_t PPB_FileIO_Impl::SetLength(int64_t length, 343 int32_t PPB_FileIO_Impl::SetLength(int64_t length,
334 PP_CompletionCallback callback) { 344 PP_CompletionCallback callback) {
335 if (file_ == base::kInvalidPlatformFileValue) 345 int32_t rv = CommonCallValidation(true, callback);
336 return PP_ERROR_FAILED; 346 if (rv != PP_OK)
337 347 return rv;
338 DCHECK(!callback_.func);
339 callback_ = callback;
340 348
341 if (!base::FileUtilProxy::Truncate( 349 if (!base::FileUtilProxy::Truncate(
342 delegate_->GetFileThreadMessageLoopProxy(), 350 delegate_->GetFileThreadMessageLoopProxy(),
343 file_, length, 351 file_, length,
344 callback_factory_.NewCallback(&PPB_FileIO_Impl::StatusCallback))) 352 callback_factory_.NewCallback(&PPB_FileIO_Impl::StatusCallback)))
345 return PP_ERROR_FAILED; 353 return PP_ERROR_FAILED;
346 354
355 RegisterCallback(callback);
347 return PP_ERROR_WOULDBLOCK; 356 return PP_ERROR_WOULDBLOCK;
348 } 357 }
349 358
350 int32_t PPB_FileIO_Impl::Flush(PP_CompletionCallback callback) { 359 int32_t PPB_FileIO_Impl::Flush(PP_CompletionCallback callback) {
351 if (file_ == base::kInvalidPlatformFileValue) 360 int32_t rv = CommonCallValidation(true, callback);
352 return PP_ERROR_FAILED; 361 if (rv != PP_OK)
353 362 return rv;
354 DCHECK(!callback_.func);
355 callback_ = callback;
356 363
357 if (!base::FileUtilProxy::Flush( 364 if (!base::FileUtilProxy::Flush(
358 delegate_->GetFileThreadMessageLoopProxy(), file_, 365 delegate_->GetFileThreadMessageLoopProxy(), file_,
359 callback_factory_.NewCallback(&PPB_FileIO_Impl::StatusCallback))) 366 callback_factory_.NewCallback(&PPB_FileIO_Impl::StatusCallback)))
360 return PP_ERROR_FAILED; 367 return PP_ERROR_FAILED;
361 368
369 RegisterCallback(callback);
362 return PP_ERROR_WOULDBLOCK; 370 return PP_ERROR_WOULDBLOCK;
363 } 371 }
364 372
365 void PPB_FileIO_Impl::Close() { 373 void PPB_FileIO_Impl::Close() {
366 if (file_ != base::kInvalidPlatformFileValue) 374 if (file_ != base::kInvalidPlatformFileValue) {
367 base::FileUtilProxy::Close( 375 base::FileUtilProxy::Close(
368 delegate_->GetFileThreadMessageLoopProxy(), file_, NULL); 376 delegate_->GetFileThreadMessageLoopProxy(), file_, NULL);
377 file_ = base::kInvalidPlatformFileValue;
378 }
369 } 379 }
370 380
371 int32_t PPB_FileIO_Impl::GetOSFileDescriptor() { 381 int32_t PPB_FileIO_Impl::GetOSFileDescriptor() {
372 #if defined(OS_POSIX) 382 #if defined(OS_POSIX)
373 return file_; 383 return file_;
374 #elif defined(OS_WIN) 384 #elif defined(OS_WIN)
375 return reinterpret_cast<uintptr_t>(file_); 385 return reinterpret_cast<uintptr_t>(file_);
376 #else 386 #else
377 #error "Platform not supported." 387 #error "Platform not supported."
378 #endif 388 #endif
379 } 389 }
380 390
381 int32_t PPB_FileIO_Impl::WillWrite(int64_t offset, 391 int32_t PPB_FileIO_Impl::WillWrite(int64_t offset,
382 int32_t bytes_to_write, 392 int32_t bytes_to_write,
383 PP_CompletionCallback callback) { 393 PP_CompletionCallback callback) {
384 // TODO(dumi): implement me 394 // TODO(dumi): implement me
385 return PP_OK; 395 return PP_OK;
386 } 396 }
387 397
388 int32_t PPB_FileIO_Impl::WillSetLength(int64_t length, 398 int32_t PPB_FileIO_Impl::WillSetLength(int64_t length,
389 PP_CompletionCallback callback) { 399 PP_CompletionCallback callback) {
390 // TODO(dumi): implement me 400 // TODO(dumi): implement me
391 return PP_OK; 401 return PP_OK;
392 } 402 }
393 403
404 int32_t PPB_FileIO_Impl::CommonCallValidation(bool is_opened,
405 PP_CompletionCallback callback) {
406 // Only asynchronous operation is supported.
407 if (!callback.func) {
408 NOTIMPLEMENTED();
409 return PP_ERROR_BADARGUMENT;
410 }
411
412 if (is_opened) {
413 if (file_ == base::kInvalidPlatformFileValue)
414 return PP_ERROR_FAILED;
415 } else {
416 if (file_ != base::kInvalidPlatformFileValue)
417 return PP_ERROR_FAILED;
418 }
419
420 if (callback_.get() && !callback_->completed())
421 return PP_ERROR_INPROGRESS;
422
423 return PP_OK;
424 }
425
426 void PPB_FileIO_Impl::RegisterCallback(PP_CompletionCallback callback) {
427 DCHECK(callback.func);
428 DCHECK(!callback_.get() || callback_->completed());
429
430 PP_Resource resource_id = GetReferenceNoAddRef();
431 CHECK(resource_id);
432 callback_ = new TrackedCompletionCallback(
433 module()->GetCallbackTracker(), resource_id, callback);
434 }
435
394 void PPB_FileIO_Impl::RunPendingCallback(int result) { 436 void PPB_FileIO_Impl::RunPendingCallback(int result) {
395 if (!callback_.func) 437 scoped_refptr<TrackedCompletionCallback> callback;
396 return; 438 callback.swap(callback_);
397 439 callback->Run(result); // Will complete abortively if necessary.
398 PP_CompletionCallback callback = {0};
399 std::swap(callback, callback_);
400 PP_RunCompletionCallback(&callback, result);
401 } 440 }
402 441
403 void PPB_FileIO_Impl::StatusCallback(base::PlatformFileError error_code) { 442 void PPB_FileIO_Impl::StatusCallback(base::PlatformFileError error_code) {
404 RunPendingCallback(PlatformFileErrorToPepperError(error_code)); 443 RunPendingCallback(PlatformFileErrorToPepperError(error_code));
405 } 444 }
406 445
407 void PPB_FileIO_Impl::AsyncOpenFileCallback( 446 void PPB_FileIO_Impl::AsyncOpenFileCallback(
408 base::PlatformFileError error_code, 447 base::PlatformFileError error_code,
409 base::PlatformFile file) { 448 base::PlatformFile file) {
410 DCHECK(file_ == base::kInvalidPlatformFileValue); 449 DCHECK(file_ == base::kInvalidPlatformFileValue);
411 file_ = file; 450 file_ = file;
412 RunPendingCallback(PlatformFileErrorToPepperError(error_code)); 451 RunPendingCallback(PlatformFileErrorToPepperError(error_code));
413 } 452 }
414 453
415 void PPB_FileIO_Impl::QueryInfoCallback( 454 void PPB_FileIO_Impl::QueryInfoCallback(
416 base::PlatformFileError error_code, 455 base::PlatformFileError error_code,
417 const base::PlatformFileInfo& file_info) { 456 const base::PlatformFileInfo& file_info) {
418 DCHECK(info_); 457 DCHECK(info_);
419 if (error_code == base::PLATFORM_FILE_OK) { 458 if (error_code == base::PLATFORM_FILE_OK) {
420 info_->size = file_info.size; 459 info_->size = file_info.size;
421 info_->creation_time = file_info.creation_time.ToDoubleT(); 460 info_->creation_time = file_info.creation_time.ToDoubleT();
422 info_->last_access_time = file_info.last_accessed.ToDoubleT(); 461 info_->last_access_time = file_info.last_accessed.ToDoubleT();
423 info_->last_modified_time = file_info.last_modified.ToDoubleT(); 462 info_->last_modified_time = file_info.last_modified.ToDoubleT();
424 info_->system_type = file_system_type_; 463 info_->system_type = file_system_type_;
425 if (file_info.is_directory) 464 if (file_info.is_directory)
426 info_->type = PP_FILETYPE_DIRECTORY; 465 info_->type = PP_FILETYPE_DIRECTORY;
427 else 466 else
428 info_->type = PP_FILETYPE_REGULAR; 467 info_->type = PP_FILETYPE_REGULAR;
429 } 468 }
469 info_ = NULL;
430 RunPendingCallback(PlatformFileErrorToPepperError(error_code)); 470 RunPendingCallback(PlatformFileErrorToPepperError(error_code));
431 } 471 }
432 472
433 void PPB_FileIO_Impl::ReadWriteCallback(base::PlatformFileError error_code, 473 void PPB_FileIO_Impl::ReadWriteCallback(base::PlatformFileError error_code,
434 int bytes_read_or_written) { 474 int bytes_read_or_written) {
435 if (error_code != base::PLATFORM_FILE_OK) 475 if (error_code != base::PLATFORM_FILE_OK)
436 RunPendingCallback(PlatformFileErrorToPepperError(error_code)); 476 RunPendingCallback(PlatformFileErrorToPepperError(error_code));
437 else 477 else
438 RunPendingCallback(bytes_read_or_written); 478 RunPendingCallback(bytes_read_or_written);
439 } 479 }
440 480
441 } // namespace ppapi 481 } // namespace ppapi
442 } // namespace webkit 482 } // namespace webkit
443
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698