summaryrefslogtreecommitdiffstats
path: root/webkit/fileapi/file_writer_delegate.cc
diff options
context:
space:
mode:
authordmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-21 05:04:51 +0000
committerdmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-21 05:04:51 +0000
commit078c6971a60c9a375e433ded4399a23a57382053 (patch)
tree94b9294bcb406857553f34cb4520a89e4231a5ee /webkit/fileapi/file_writer_delegate.cc
parentcbf61bccc4488871222e616065b1104e57c5e9ac (diff)
downloadchromium_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.cc50
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);
}