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

Side by Side Diff: webkit/fileapi/file_writer_delegate.cc

Issue 10986045: Flush at the end of local file writing in FileWriter API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 2 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 | « webkit/fileapi/file_writer_delegate.h ('k') | webkit/fileapi/local_file_stream_writer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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/fileapi/file_writer_delegate.h" 5 #include "webkit/fileapi/file_writer_delegate.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_proxy.h" 9 #include "base/file_util_proxy.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
11 #include "base/message_loop_proxy.h" 11 #include "base/message_loop_proxy.h"
12 #include "base/sequenced_task_runner.h" 12 #include "base/sequenced_task_runner.h"
13 #include "base/threading/thread_restrictions.h" 13 #include "base/threading/thread_restrictions.h"
14 #include "net/base/net_errors.h" 14 #include "net/base/net_errors.h"
15 #include "webkit/fileapi/file_stream_writer.h" 15 #include "webkit/fileapi/file_stream_writer.h"
16 #include "webkit/fileapi/file_system_context.h" 16 #include "webkit/fileapi/file_system_context.h"
17 17
18 namespace fileapi { 18 namespace fileapi {
19 19
20 static const int kReadBufSize = 32768; 20 static const int kReadBufSize = 32768;
21 21
22 namespace { 22 namespace {
23 23
24 base::PlatformFileError NetErrorToPlatformFileError(int error) { 24 base::PlatformFileError NetErrorToPlatformFileError(int error) {
25 // TODO(kinuko): Move this static method to more convenient place. 25 // TODO(kinuko): Move this static method to more convenient place.
26 switch (error) { 26 switch (error) {
27 case net::OK:
28 return base::PLATFORM_FILE_OK;
27 case net::ERR_FILE_NO_SPACE: 29 case net::ERR_FILE_NO_SPACE:
28 return base::PLATFORM_FILE_ERROR_NO_SPACE; 30 return base::PLATFORM_FILE_ERROR_NO_SPACE;
29 case net::ERR_FILE_NOT_FOUND: 31 case net::ERR_FILE_NOT_FOUND:
30 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 32 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
31 case net::ERR_ACCESS_DENIED: 33 case net::ERR_ACCESS_DENIED:
32 return base::PLATFORM_FILE_ERROR_ACCESS_DENIED; 34 return base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
33 default: 35 default:
34 return base::PLATFORM_FILE_ERROR_FAILED; 36 return base::PLATFORM_FILE_ERROR_FAILED;
35 } 37 }
36 } 38 }
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 void FileWriterDelegate::OnProgress(int bytes_written, bool done) { 188 void FileWriterDelegate::OnProgress(int bytes_written, bool done) {
187 DCHECK(bytes_written + bytes_written_backlog_ >= bytes_written_backlog_); 189 DCHECK(bytes_written + bytes_written_backlog_ >= bytes_written_backlog_);
188 static const int kMinProgressDelayMS = 200; 190 static const int kMinProgressDelayMS = 200;
189 base::Time currentTime = base::Time::Now(); 191 base::Time currentTime = base::Time::Now();
190 if (done || last_progress_event_time_.is_null() || 192 if (done || last_progress_event_time_.is_null() ||
191 (currentTime - last_progress_event_time_).InMilliseconds() > 193 (currentTime - last_progress_event_time_).InMilliseconds() >
192 kMinProgressDelayMS) { 194 kMinProgressDelayMS) {
193 bytes_written += bytes_written_backlog_; 195 bytes_written += bytes_written_backlog_;
194 last_progress_event_time_ = currentTime; 196 last_progress_event_time_ = currentTime;
195 bytes_written_backlog_ = 0; 197 bytes_written_backlog_ = 0;
196 write_callback_.Run( 198 if (done) {
197 base::PLATFORM_FILE_OK, bytes_written, done); 199 // All write operation completed, be sure to flush the data.
200 int result = file_stream_writer_->Flush(
201 base::Bind(&FileWriterDelegate::OnSuccessfulCompletion,
202 weak_factory_.GetWeakPtr(),
203 bytes_written));
204 if (result != net::ERR_IO_PENDING) {
205 write_callback_.Run(NetErrorToPlatformFileError(result),
206 bytes_written, done);
207 }
208 } else {
209 write_callback_.Run(base::PLATFORM_FILE_OK, bytes_written, done);
210 }
kinuko 2012/09/26 08:34:08 Do we need to do this when error has happend after
kinaba 2012/09/28 11:15:25 Thanks. I rebased this CL on top of it. I've also
198 return; 211 return;
199 } 212 }
200 bytes_written_backlog_ += bytes_written; 213 bytes_written_backlog_ += bytes_written;
201 } 214 }
202 215
203 void FileWriterDelegate::OnWriteCancelled(int status) { 216 void FileWriterDelegate::OnWriteCancelled(int status) {
204 write_callback_.Run(base::PLATFORM_FILE_ERROR_ABORT, 0, true); 217 write_callback_.Run(base::PLATFORM_FILE_ERROR_ABORT, 0, true);
205 } 218 }
206 219
220 void FileWriterDelegate::OnSuccessfulCompletion(int bytes_written, int status) {
221 write_callback_.Run(NetErrorToPlatformFileError(status), bytes_written, true);
222 }
223
207 } // namespace fileapi 224 } // namespace fileapi
OLDNEW
« no previous file with comments | « webkit/fileapi/file_writer_delegate.h ('k') | webkit/fileapi/local_file_stream_writer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698