diff options
author | dmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-21 05:04:51 +0000 |
---|---|---|
committer | dmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-21 05:04:51 +0000 |
commit | 078c6971a60c9a375e433ded4399a23a57382053 (patch) | |
tree | 94b9294bcb406857553f34cb4520a89e4231a5ee /webkit/fileapi/file_writer_delegate.cc | |
parent | cbf61bccc4488871222e616065b1104e57c5e9ac (diff) | |
download | chromium_src-078c6971a60c9a375e433ded4399a23a57382053.zip chromium_src-078c6971a60c9a375e433ded4399a23a57382053.tar.gz chromium_src-078c6971a60c9a375e433ded4399a23a57382053.tar.bz2 |
Add "allowed growth" for writing operations, such as copy, move, write and truncate.
A writing operation which increases the file size more than "allowed growth" results in PLATFORM_FILE_ERROR_NO_SPACE.
BUG=74841
TEST=FileWriterDelegateTest.*,QuotaFileUtilTest.*,FileSystemOperationTest.*
Review URL: http://codereview.chromium.org/6725021
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@82441 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/fileapi/file_writer_delegate.cc')
-rw-r--r-- | webkit/fileapi/file_writer_delegate.cc | 50 |
1 files changed, 41 insertions, 9 deletions
diff --git a/webkit/fileapi/file_writer_delegate.cc b/webkit/fileapi/file_writer_delegate.cc index c0574fca..a06c80e 100644 --- a/webkit/fileapi/file_writer_delegate.cc +++ b/webkit/fileapi/file_writer_delegate.cc @@ -4,45 +4,65 @@ #include "webkit/fileapi/file_writer_delegate.h" +#include "base/file_util_proxy.h" #include "base/message_loop.h" #include "base/threading/thread_restrictions.h" #include "net/base/net_errors.h" #include "webkit/fileapi/file_system_operation.h" +#include "webkit/fileapi/quota_file_util.h" namespace fileapi { static const int kReadBufSize = 32768; FileWriterDelegate::FileWriterDelegate( - FileSystemOperation* file_system_operation, - int64 offset) + FileSystemOperation* file_system_operation, int64 offset) : file_system_operation_(file_system_operation), file_(base::kInvalidPlatformFileValue), offset_(offset), bytes_read_backlog_(0), bytes_written_(0), bytes_read_(0), + total_bytes_written_(0), + allowed_bytes_to_write_(0), io_buffer_(new net::IOBufferWithSize(kReadBufSize)), io_callback_(ALLOW_THIS_IN_INITIALIZER_LIST(this), &FileWriterDelegate::OnDataWritten), - method_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { + method_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), + callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { } FileWriterDelegate::~FileWriterDelegate() { } -void FileWriterDelegate::Start(base::PlatformFile file, - net::URLRequest* request) { - file_ = file; - request_ = request; +void FileWriterDelegate::OnGetFileInfoForWrite( + base::PlatformFileError error, + const base::PlatformFileInfo& file_info) { + if (allowed_bytes_growth_ != QuotaFileUtil::kNoLimit) + allowed_bytes_to_write_ = file_info.size - offset_ + allowed_bytes_growth_; + else + allowed_bytes_to_write_ = QuotaFileUtil::kNoLimit; file_stream_.reset( new net::FileStream( - file, + file_, base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE | base::PLATFORM_FILE_ASYNC)); request_->Start(); } +void FileWriterDelegate::Start(base::PlatformFile file, + net::URLRequest* request, + int64 allowed_bytes_growth, + scoped_refptr<base::MessageLoopProxy> proxy) { + file_ = file; + request_ = request; + allowed_bytes_growth_ = allowed_bytes_growth; + + base::FileUtilProxy::GetFileInfoFromPlatformFile( + proxy, file, callback_factory_.NewCallback( + &FileWriterDelegate::OnGetFileInfoForWrite)); +} + void FileWriterDelegate::OnReceivedRedirect( net::URLRequest* request, const GURL& new_url, bool* defer_redirect) { NOTREACHED(); @@ -120,8 +140,18 @@ void FileWriterDelegate::OnDataReceived(int bytes_read) { } void FileWriterDelegate::Write() { + DCHECK(total_bytes_written_ <= allowed_bytes_to_write_); + if (total_bytes_written_ >= allowed_bytes_to_write_) { + OnError(base::PLATFORM_FILE_ERROR_NO_SPACE); + return; + } + + int64 bytes_to_write = bytes_read_ - bytes_written_; + if (bytes_to_write > allowed_bytes_to_write_ - total_bytes_written_) + bytes_to_write = allowed_bytes_to_write_ - total_bytes_written_; + int write_response = file_stream_->Write(io_buffer_->data() + bytes_written_, - bytes_read_ - bytes_written_, + static_cast<int>(bytes_to_write), &io_callback_); if (write_response > 0) MessageLoop::current()->PostTask( @@ -136,6 +166,7 @@ void FileWriterDelegate::OnDataWritten(int write_response) { if (write_response > 0) { OnProgress(write_response, false); bytes_written_ += write_response; + total_bytes_written_ += write_response; if (bytes_written_ == bytes_read_) Read(); else @@ -146,6 +177,7 @@ void FileWriterDelegate::OnDataWritten(int write_response) { } void FileWriterDelegate::OnError(base::PlatformFileError error) { + request_->set_delegate(NULL); request_->Cancel(); file_system_operation_->DidWrite(error, 0, true); } |