diff options
author | ericu@google.com <ericu@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-07 20:49:59 +0000 |
---|---|---|
committer | ericu@google.com <ericu@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-07 20:49:59 +0000 |
commit | 74b3dc7a7ea8ff8c2a87d54eb3362afea597165a (patch) | |
tree | 20b5713585d131d42537800535fee30cec513f6e /webkit/fileapi | |
parent | 39f1166de3823e6b4e7164838b958e2028d6c1ec (diff) | |
download | chromium_src-74b3dc7a7ea8ff8c2a87d54eb3362afea597165a.zip chromium_src-74b3dc7a7ea8ff8c2a87d54eb3362afea597165a.tar.gz chromium_src-74b3dc7a7ea8ff8c2a87d54eb3362afea597165a.tar.bz2 |
Revert 61833 - Add the actual writing-files part of FileWriter.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/3476002
TBR=ericu@google.com
Review URL: http://codereview.chromium.org/3630002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61842 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/fileapi')
-rw-r--r-- | webkit/fileapi/file_system_operation.cc | 60 | ||||
-rw-r--r-- | webkit/fileapi/file_system_operation.h | 19 | ||||
-rw-r--r-- | webkit/fileapi/file_writer_delegate.cc | 164 | ||||
-rw-r--r-- | webkit/fileapi/file_writer_delegate.h | 71 | ||||
-rw-r--r-- | webkit/fileapi/webkit_fileapi.gypi | 2 |
5 files changed, 11 insertions, 305 deletions
diff --git a/webkit/fileapi/file_system_operation.cc b/webkit/fileapi/file_system_operation.cc index 29690b9..29336a8 100644 --- a/webkit/fileapi/file_system_operation.cc +++ b/webkit/fileapi/file_system_operation.cc @@ -5,9 +5,8 @@ #include "webkit/fileapi/file_system_operation.h" #include "base/time.h" -#include "net/url_request/url_request_context.h" +#include "googleurl/src/gurl.h" #include "webkit/fileapi/file_system_callback_dispatcher.h" -#include "webkit/fileapi/file_writer_delegate.h" namespace fileapi { @@ -25,8 +24,6 @@ FileSystemOperation::FileSystemOperation( } FileSystemOperation::~FileSystemOperation() { - if (file_writer_delegate_.get()) - base::FileUtilProxy::Close(proxy_, file_writer_delegate_->file(), NULL); } void FileSystemOperation::CreateFile(const FilePath& path, @@ -133,7 +130,6 @@ void FileSystemOperation::Remove(const FilePath& path, bool recursive) { } void FileSystemOperation::Write( - scoped_refptr<URLRequestContext> url_request_context, const FilePath& path, const GURL& blob_url, int64 offset) { @@ -141,28 +137,7 @@ void FileSystemOperation::Write( DCHECK(kOperationNone == pending_operation_); pending_operation_ = kOperationWrite; #endif - DCHECK(blob_url.is_valid()); - file_writer_delegate_.reset(new FileWriterDelegate(this, offset)); - blob_request_.reset(new URLRequest(blob_url, file_writer_delegate_.get())); - blob_request_->set_context(url_request_context); - base::FileUtilProxy::CreateOrOpen( - proxy_, - path, - base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE | - base::PLATFORM_FILE_ASYNC, - callback_factory_.NewCallback( - &FileSystemOperation::OnFileOpenedForWrite)); -} - -void FileSystemOperation::OnFileOpenedForWrite( - base::PlatformFileError rv, - base::PassPlatformFile file, - bool created) { - if (base::PLATFORM_FILE_OK != rv) { - dispatcher_->DidFail(rv); - return; - } - file_writer_delegate_->Start(file.ReleaseValue(), blob_request_.get()); + NOTREACHED(); } void FileSystemOperation::Truncate(const FilePath& path, int64 length) { @@ -191,32 +166,15 @@ void FileSystemOperation::TouchFile(const FilePath& path, // We can only get here on a write or truncate that's not yet completed. // We don't support cancelling any other operation at this time. void FileSystemOperation::Cancel(FileSystemOperation* cancel_operation) { - if (file_writer_delegate_.get()) { #ifndef NDEBUG - DCHECK(kOperationWrite == pending_operation_); + DCHECK(kOperationTruncate == pending_operation_); + // FIXME(ericu): Cancelling for writes coming soon. #endif - // Writes are done without proxying through FileUtilProxy after the initial - // opening of the PlatformFile. All state changes are done on this thread, - // so we're guaranteed to be able to shut down atomically. We do need to - // check that the file has been opened [which means the blob_request_ has - // been created], so we know how much we need to do. - if (blob_request_.get()) - // This halts any calls to file_writer_delegate_ from blob_request_. - blob_request_->Cancel(); - - // This deletes us, and by proxy deletes file_writer_delegate_ if any. - dispatcher_->DidFail(base::PLATFORM_FILE_ERROR_ABORT); - cancel_operation->dispatcher_->DidSucceed(); - } else { -#ifndef NDEBUG - DCHECK(kOperationTruncate == pending_operation_); -#endif - // We're cancelling a truncate operation, but we can't actually stop it - // since it's been proxied to another thread. We need to save the - // cancel_operation so that when the truncate returns, it can see that it's - // been cancelled, report it, and report that the cancel has succeeded. - cancel_operation_ = cancel_operation; - } + // We're cancelling a truncate operation, but we can't actually stop it + // since it's been proxied to another thread. We need to save the + // cancel_operation so that when the truncate returns, it can see that it's + // been cancelled, report it, and report that the cancel has succeeded. + cancel_operation_ = cancel_operation; } void FileSystemOperation::DidCreateFileExclusive( diff --git a/webkit/fileapi/file_system_operation.h b/webkit/fileapi/file_system_operation.h index bfa4141..ba65b7d 100644 --- a/webkit/fileapi/file_system_operation.h +++ b/webkit/fileapi/file_system_operation.h @@ -14,20 +14,16 @@ #include "base/ref_counted.h" #include "base/scoped_callback_factory.h" #include "base/scoped_ptr.h" -#include "googleurl/src/gurl.h" namespace base { class Time; } class GURL; -class URLRequest; -class URLRequestContext; namespace fileapi { class FileSystemCallbackDispatcher; -class FileWriterDelegate; // This class is designed to serve one-time file system operation per instance. // Only one method(CreateFile, CreateDirectory, Copy, Move, DirectoryExists, @@ -62,9 +58,7 @@ class FileSystemOperation { void Remove(const FilePath& path, bool recursive); - void Write( - scoped_refptr<URLRequestContext> url_request_context, - const FilePath& path, const GURL& blob_url, int64 offset); + void Write(const FilePath& path, const GURL& blob_url, int64 offset); void Truncate(const FilePath& path, int64 length); @@ -113,19 +107,10 @@ class FileSystemOperation { void DidTouchFile(base::PlatformFileError rv); - // Helper for Write(). - void OnFileOpenedForWrite( - base::PlatformFileError rv, - base::PassPlatformFile file, - bool created); - scoped_ptr<FileSystemCallbackDispatcher> dispatcher_; + base::ScopedCallbackFactory<FileSystemOperation> callback_factory_; - // These are all used only by Write(). - friend class FileWriterDelegate; - scoped_ptr<FileWriterDelegate> file_writer_delegate_; - scoped_ptr<URLRequest> blob_request_; FileSystemOperation* cancel_operation_; #ifndef NDEBUG diff --git a/webkit/fileapi/file_writer_delegate.cc b/webkit/fileapi/file_writer_delegate.cc deleted file mode 100644 index d84d22f32..0000000 --- a/webkit/fileapi/file_writer_delegate.cc +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "webkit/fileapi/file_writer_delegate.h" - -#include "base/message_loop.h" -#include "net/base/net_errors.h" -#include "webkit/fileapi/file_system_operation.h" - -namespace fileapi { - -static const int kReadBufSize = 32768; - -FileWriterDelegate::FileWriterDelegate( - 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), - io_buffer_(new net::IOBufferWithSize(kReadBufSize)), - callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), - method_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { -} - -FileWriterDelegate::~FileWriterDelegate() { -} - -void FileWriterDelegate::Start(base::PlatformFile file, URLRequest* request) { - file_ = file; - request_ = request; - file_stream_.reset( - new net::FileStream( - file, - base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE | - base::PLATFORM_FILE_ASYNC)); - request_->Start(); -} - -void FileWriterDelegate::OnReceivedRedirect( - URLRequest* request, const GURL& new_url, bool* defer_redirect) { - NOTREACHED(); - OnError(base::PLATFORM_FILE_ERROR_SECURITY); -} - -void FileWriterDelegate::OnAuthRequired( - URLRequest* request, net::AuthChallengeInfo* auth_info) { - NOTREACHED(); - OnError(base::PLATFORM_FILE_ERROR_SECURITY); -} - -void FileWriterDelegate::OnCertificateRequested( - URLRequest* request, net::SSLCertRequestInfo* cert_request_info) { - NOTREACHED(); - OnError(base::PLATFORM_FILE_ERROR_SECURITY); -} - -void FileWriterDelegate::OnSSLCertificateError( - URLRequest* request, int cert_error, net::X509Certificate* cert) { - NOTREACHED(); - OnError(base::PLATFORM_FILE_ERROR_SECURITY); -} - -void FileWriterDelegate::OnResponseStarted(URLRequest* request) { - DCHECK_EQ(request_, request); - if (!request->status().is_success()) { - OnError(base::PLATFORM_FILE_ERROR_FAILED); - return; - } - int64 error = file_stream_->Seek(net::FROM_BEGIN, offset_); - if (error != offset_) { - OnError(base::PLATFORM_FILE_ERROR_FAILED); - return; - } - Read(); -} - -void FileWriterDelegate::OnReadCompleted(URLRequest* request, int bytes_read) { - DCHECK_EQ(request_, request); - if (!request->status().is_success()) { - OnError(base::PLATFORM_FILE_ERROR_FAILED); - return; - } - OnDataReceived(bytes_read); -} - -void FileWriterDelegate::Read() { - bytes_written_ = 0; - bytes_read_ = 0; - if (request_->Read(io_buffer_.get(), io_buffer_->size(), &bytes_read_)) { - MessageLoop::current()->PostTask( - FROM_HERE, - method_factory_.NewRunnableMethod( - &FileWriterDelegate::OnDataReceived, bytes_read_)); - } else if (!request_->status().is_io_pending()) { - OnError(base::PLATFORM_FILE_ERROR_FAILED); - } -} - -void FileWriterDelegate::OnDataReceived(int bytes_read) { - bytes_read_ = bytes_read; - if (!bytes_read_) { // We're done. - OnProgress(0, true); - } else { - // This could easily be optimized to rotate between a pool of buffers, so - // that we could read and write at the same time. It's not yet clear that - // it's necessary. - Write(); - } -} - -void FileWriterDelegate::Write() { - int write_response = file_stream_->Write( - io_buffer_->data() + bytes_written_, - bytes_read_ - bytes_written_, - callback_factory_.NewCallback(&FileWriterDelegate::OnDataWritten)); - if (write_response > 0) - MessageLoop::current()->PostTask( - FROM_HERE, - method_factory_.NewRunnableMethod( - &FileWriterDelegate::OnDataWritten, write_response)); - else if (net::ERR_IO_PENDING != write_response) - OnError(base::PLATFORM_FILE_ERROR_FAILED); -} - -void FileWriterDelegate::OnDataWritten(int write_response) { - if (write_response > 0) { - OnProgress(write_response, false); - bytes_written_ += write_response; - if (bytes_written_ == bytes_read_) - Read(); - else - Write(); - } else { - OnError(base::PLATFORM_FILE_ERROR_FAILED); - } -} - -void FileWriterDelegate::OnError(base::PlatformFileError error) { - request_->Cancel(); - file_system_operation_->DidWrite(error, 0, true); -} - -void FileWriterDelegate::OnProgress(int bytes_read, bool done) { - DCHECK(bytes_read + bytes_read_backlog_ >= bytes_read_backlog_); - static const int kMinProgressDelayMS = 200; - base::Time currentTime = base::Time::Now(); - if (done || last_progress_event_time_.is_null() || - (currentTime - last_progress_event_time_).InMilliseconds() > - kMinProgressDelayMS) { - file_system_operation_->DidWrite(base::PLATFORM_FILE_OK, - bytes_read + bytes_read_backlog_, done); - last_progress_event_time_ = currentTime; - bytes_read_backlog_ = 0; - } else { - bytes_read_backlog_ += bytes_read; - } -} - -} // namespace fileapi - diff --git a/webkit/fileapi/file_writer_delegate.h b/webkit/fileapi/file_writer_delegate.h deleted file mode 100644 index ed35ce6..0000000 --- a/webkit/fileapi/file_writer_delegate.h +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef WEBKIT_FILEAPI_FILE_WRITER_DELEGATE_H_ -#define WEBKIT_FILEAPI_FILE_WRITER_DELEGATE_H_ - -#include "base/file_path.h" -#include "base/platform_file.h" -#include "base/ref_counted.h" -#include "base/scoped_callback_factory.h" -#include "base/scoped_ptr.h" -#include "base/task.h" -#include "base/time.h" -#include "net/base/file_stream.h" -#include "net/base/io_buffer.h" -#include "net/url_request/url_request.h" - -namespace fileapi { - -class FileSystemOperation; - -class FileWriterDelegate : public URLRequest::Delegate { - public: - FileWriterDelegate( - FileSystemOperation* write_operation, - int64 offset); - virtual ~FileWriterDelegate(); - - void Start(base::PlatformFile file, URLRequest* request); - base::PlatformFile file() { - return file_; - } - - virtual void OnReceivedRedirect( - URLRequest* request, const GURL& new_url, bool* defer_redirect); - virtual void OnAuthRequired( - URLRequest* request, net::AuthChallengeInfo* auth_info); - virtual void OnCertificateRequested( - URLRequest* request, net::SSLCertRequestInfo* cert_request_info); - virtual void OnSSLCertificateError( - URLRequest* request, int cert_error, net::X509Certificate* cert); - virtual void OnResponseStarted(URLRequest* request); - virtual void OnReadCompleted(URLRequest* request, int bytes_read); - - private: - void Read(); - void OnDataReceived(int bytes_read); - void Write(); - void OnDataWritten(int write_response); - void OnError(base::PlatformFileError error); - void OnProgress(int bytes_read, bool done); - - FileSystemOperation* file_system_operation_; - base::PlatformFile file_; - int64 offset_; - base::Time last_progress_event_time_; - int bytes_read_backlog_; - int bytes_written_; - int bytes_read_; - scoped_refptr<net::IOBufferWithSize> io_buffer_; - scoped_ptr<net::FileStream> file_stream_; - URLRequest* request_; - base::ScopedCallbackFactory<FileWriterDelegate> callback_factory_; - ScopedRunnableMethodFactory<FileWriterDelegate> method_factory_; -}; - -} // namespace fileapi - -#endif // WEBKIT_FILEAPI_FILE_WRITER_DELEGATE_H_ - diff --git a/webkit/fileapi/webkit_fileapi.gypi b/webkit/fileapi/webkit_fileapi.gypi index a795da4..b94cf9e 100644 --- a/webkit/fileapi/webkit_fileapi.gypi +++ b/webkit/fileapi/webkit_fileapi.gypi @@ -18,8 +18,6 @@ 'file_system_operation.cc', 'file_system_operation.h', 'file_system_types.h', - 'file_writer_delegate.cc', - 'file_writer_delegate.h', ], 'conditions': [ ['inside_chromium_build==0', { |