| Index: webkit/browser/appcache/appcache_response.cc
|
| diff --git a/webkit/browser/appcache/appcache_response.cc b/webkit/browser/appcache/appcache_response.cc
|
| deleted file mode 100644
|
| index cd0d3847b858f4e591b9f892eb1a08cc599b742f..0000000000000000000000000000000000000000
|
| --- a/webkit/browser/appcache/appcache_response.cc
|
| +++ /dev/null
|
| @@ -1,423 +0,0 @@
|
| -// Copyright (c) 2012 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/browser/appcache/appcache_response.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/bind_helpers.h"
|
| -#include "base/compiler_specific.h"
|
| -#include "base/logging.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/pickle.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "net/base/completion_callback.h"
|
| -#include "net/base/io_buffer.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "webkit/browser/appcache/appcache_storage.h"
|
| -
|
| -namespace appcache {
|
| -
|
| -namespace {
|
| -
|
| -// Disk cache entry data indices.
|
| -enum {
|
| - kResponseInfoIndex,
|
| - kResponseContentIndex
|
| -};
|
| -
|
| -// An IOBuffer that wraps a pickle's data. Ownership of the
|
| -// pickle is transfered to the WrappedPickleIOBuffer object.
|
| -class WrappedPickleIOBuffer : public net::WrappedIOBuffer {
|
| - public:
|
| - explicit WrappedPickleIOBuffer(const Pickle* pickle) :
|
| - net::WrappedIOBuffer(reinterpret_cast<const char*>(pickle->data())),
|
| - pickle_(pickle) {
|
| - DCHECK(pickle->data());
|
| - }
|
| -
|
| - private:
|
| - virtual ~WrappedPickleIOBuffer() {}
|
| -
|
| - scoped_ptr<const Pickle> pickle_;
|
| -};
|
| -
|
| -} // anon namespace
|
| -
|
| -
|
| -// AppCacheResponseInfo ----------------------------------------------
|
| -
|
| -AppCacheResponseInfo::AppCacheResponseInfo(
|
| - AppCacheStorage* storage, const GURL& manifest_url,
|
| - int64 response_id, net::HttpResponseInfo* http_info,
|
| - int64 response_data_size)
|
| - : manifest_url_(manifest_url), response_id_(response_id),
|
| - http_response_info_(http_info), response_data_size_(response_data_size),
|
| - storage_(storage) {
|
| - DCHECK(http_info);
|
| - DCHECK(response_id != kAppCacheNoResponseId);
|
| - storage_->working_set()->AddResponseInfo(this);
|
| -}
|
| -
|
| -AppCacheResponseInfo::~AppCacheResponseInfo() {
|
| - storage_->working_set()->RemoveResponseInfo(this);
|
| -}
|
| -
|
| -// HttpResponseInfoIOBuffer ------------------------------------------
|
| -
|
| -HttpResponseInfoIOBuffer::HttpResponseInfoIOBuffer()
|
| - : response_data_size(kUnkownResponseDataSize) {}
|
| -
|
| -HttpResponseInfoIOBuffer::HttpResponseInfoIOBuffer(net::HttpResponseInfo* info)
|
| - : http_info(info), response_data_size(kUnkownResponseDataSize) {}
|
| -
|
| -HttpResponseInfoIOBuffer::~HttpResponseInfoIOBuffer() {}
|
| -
|
| -// AppCacheResponseIO ----------------------------------------------
|
| -
|
| -AppCacheResponseIO::AppCacheResponseIO(
|
| - int64 response_id, int64 group_id, AppCacheDiskCacheInterface* disk_cache)
|
| - : response_id_(response_id),
|
| - group_id_(group_id),
|
| - disk_cache_(disk_cache),
|
| - entry_(NULL),
|
| - buffer_len_(0),
|
| - weak_factory_(this) {
|
| -}
|
| -
|
| -AppCacheResponseIO::~AppCacheResponseIO() {
|
| - if (entry_)
|
| - entry_->Close();
|
| -}
|
| -
|
| -void AppCacheResponseIO::ScheduleIOCompletionCallback(int result) {
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE, base::Bind(&AppCacheResponseIO::OnIOComplete,
|
| - weak_factory_.GetWeakPtr(), result));
|
| -}
|
| -
|
| -void AppCacheResponseIO::InvokeUserCompletionCallback(int result) {
|
| - // Clear the user callback and buffers prior to invoking the callback
|
| - // so the caller can schedule additional operations in the callback.
|
| - buffer_ = NULL;
|
| - info_buffer_ = NULL;
|
| - net::CompletionCallback cb = callback_;
|
| - callback_.Reset();
|
| - cb.Run(result);
|
| -}
|
| -
|
| -void AppCacheResponseIO::ReadRaw(int index, int offset,
|
| - net::IOBuffer* buf, int buf_len) {
|
| - DCHECK(entry_);
|
| - int rv = entry_->Read(
|
| - index, offset, buf, buf_len,
|
| - base::Bind(&AppCacheResponseIO::OnRawIOComplete,
|
| - weak_factory_.GetWeakPtr()));
|
| - if (rv != net::ERR_IO_PENDING)
|
| - ScheduleIOCompletionCallback(rv);
|
| -}
|
| -
|
| -void AppCacheResponseIO::WriteRaw(int index, int offset,
|
| - net::IOBuffer* buf, int buf_len) {
|
| - DCHECK(entry_);
|
| - int rv = entry_->Write(
|
| - index, offset, buf, buf_len,
|
| - base::Bind(&AppCacheResponseIO::OnRawIOComplete,
|
| - weak_factory_.GetWeakPtr()));
|
| - if (rv != net::ERR_IO_PENDING)
|
| - ScheduleIOCompletionCallback(rv);
|
| -}
|
| -
|
| -void AppCacheResponseIO::OnRawIOComplete(int result) {
|
| - DCHECK_NE(net::ERR_IO_PENDING, result);
|
| - OnIOComplete(result);
|
| -}
|
| -
|
| -
|
| -// AppCacheResponseReader ----------------------------------------------
|
| -
|
| -AppCacheResponseReader::AppCacheResponseReader(
|
| - int64 response_id, int64 group_id, AppCacheDiskCacheInterface* disk_cache)
|
| - : AppCacheResponseIO(response_id, group_id, disk_cache),
|
| - range_offset_(0),
|
| - range_length_(kint32max),
|
| - read_position_(0),
|
| - weak_factory_(this) {
|
| -}
|
| -
|
| -AppCacheResponseReader::~AppCacheResponseReader() {
|
| -}
|
| -
|
| -void AppCacheResponseReader::ReadInfo(HttpResponseInfoIOBuffer* info_buf,
|
| - const net::CompletionCallback& callback) {
|
| - DCHECK(!callback.is_null());
|
| - DCHECK(!IsReadPending());
|
| - DCHECK(info_buf);
|
| - DCHECK(!info_buf->http_info.get());
|
| - DCHECK(!buffer_.get());
|
| - DCHECK(!info_buffer_.get());
|
| -
|
| - info_buffer_ = info_buf;
|
| - callback_ = callback; // cleared on completion
|
| - OpenEntryIfNeededAndContinue();
|
| -}
|
| -
|
| -void AppCacheResponseReader::ContinueReadInfo() {
|
| - if (!entry_) {
|
| - ScheduleIOCompletionCallback(net::ERR_CACHE_MISS);
|
| - return;
|
| - }
|
| -
|
| - int size = entry_->GetSize(kResponseInfoIndex);
|
| - if (size <= 0) {
|
| - ScheduleIOCompletionCallback(net::ERR_CACHE_MISS);
|
| - return;
|
| - }
|
| -
|
| - buffer_ = new net::IOBuffer(size);
|
| - ReadRaw(kResponseInfoIndex, 0, buffer_.get(), size);
|
| -}
|
| -
|
| -void AppCacheResponseReader::ReadData(net::IOBuffer* buf, int buf_len,
|
| - const net::CompletionCallback& callback) {
|
| - DCHECK(!callback.is_null());
|
| - DCHECK(!IsReadPending());
|
| - DCHECK(buf);
|
| - DCHECK(buf_len >= 0);
|
| - DCHECK(!buffer_.get());
|
| - DCHECK(!info_buffer_.get());
|
| -
|
| - buffer_ = buf;
|
| - buffer_len_ = buf_len;
|
| - callback_ = callback; // cleared on completion
|
| - OpenEntryIfNeededAndContinue();
|
| -}
|
| -
|
| -void AppCacheResponseReader::ContinueReadData() {
|
| - if (!entry_) {
|
| - ScheduleIOCompletionCallback(net::ERR_CACHE_MISS);
|
| - return;
|
| - }
|
| -
|
| - if (read_position_ + buffer_len_ > range_length_) {
|
| - // TODO(michaeln): What about integer overflows?
|
| - DCHECK(range_length_ >= read_position_);
|
| - buffer_len_ = range_length_ - read_position_;
|
| - }
|
| - ReadRaw(kResponseContentIndex,
|
| - range_offset_ + read_position_,
|
| - buffer_.get(),
|
| - buffer_len_);
|
| -}
|
| -
|
| -void AppCacheResponseReader::SetReadRange(int offset, int length) {
|
| - DCHECK(!IsReadPending() && !read_position_);
|
| - range_offset_ = offset;
|
| - range_length_ = length;
|
| -}
|
| -
|
| -void AppCacheResponseReader::OnIOComplete(int result) {
|
| - if (result >= 0) {
|
| - if (info_buffer_.get()) {
|
| - // Deserialize the http info structure, ensuring we got headers.
|
| - Pickle pickle(buffer_->data(), result);
|
| - scoped_ptr<net::HttpResponseInfo> info(new net::HttpResponseInfo);
|
| - bool response_truncated = false;
|
| - if (!info->InitFromPickle(pickle, &response_truncated) ||
|
| - !info->headers.get()) {
|
| - InvokeUserCompletionCallback(net::ERR_FAILED);
|
| - return;
|
| - }
|
| - DCHECK(!response_truncated);
|
| - info_buffer_->http_info.reset(info.release());
|
| -
|
| - // Also return the size of the response body
|
| - DCHECK(entry_);
|
| - info_buffer_->response_data_size =
|
| - entry_->GetSize(kResponseContentIndex);
|
| - } else {
|
| - read_position_ += result;
|
| - }
|
| - }
|
| - InvokeUserCompletionCallback(result);
|
| -}
|
| -
|
| -void AppCacheResponseReader::OpenEntryIfNeededAndContinue() {
|
| - int rv;
|
| - AppCacheDiskCacheInterface::Entry** entry_ptr = NULL;
|
| - if (entry_) {
|
| - rv = net::OK;
|
| - } else if (!disk_cache_) {
|
| - rv = net::ERR_FAILED;
|
| - } else {
|
| - entry_ptr = new AppCacheDiskCacheInterface::Entry*;
|
| - open_callback_ =
|
| - base::Bind(&AppCacheResponseReader::OnOpenEntryComplete,
|
| - weak_factory_.GetWeakPtr(), base::Owned(entry_ptr));
|
| - rv = disk_cache_->OpenEntry(response_id_, entry_ptr, open_callback_);
|
| - }
|
| -
|
| - if (rv != net::ERR_IO_PENDING)
|
| - OnOpenEntryComplete(entry_ptr, rv);
|
| -}
|
| -
|
| -void AppCacheResponseReader::OnOpenEntryComplete(
|
| - AppCacheDiskCacheInterface::Entry** entry, int rv) {
|
| - DCHECK(info_buffer_.get() || buffer_.get());
|
| -
|
| - if (!open_callback_.is_null()) {
|
| - if (rv == net::OK) {
|
| - DCHECK(entry);
|
| - entry_ = *entry;
|
| - }
|
| - open_callback_.Reset();
|
| - }
|
| -
|
| - if (info_buffer_.get())
|
| - ContinueReadInfo();
|
| - else
|
| - ContinueReadData();
|
| -}
|
| -
|
| -// AppCacheResponseWriter ----------------------------------------------
|
| -
|
| -AppCacheResponseWriter::AppCacheResponseWriter(
|
| - int64 response_id, int64 group_id, AppCacheDiskCacheInterface* disk_cache)
|
| - : AppCacheResponseIO(response_id, group_id, disk_cache),
|
| - info_size_(0),
|
| - write_position_(0),
|
| - write_amount_(0),
|
| - creation_phase_(INITIAL_ATTEMPT),
|
| - weak_factory_(this) {
|
| -}
|
| -
|
| -AppCacheResponseWriter::~AppCacheResponseWriter() {
|
| -}
|
| -
|
| -void AppCacheResponseWriter::WriteInfo(
|
| - HttpResponseInfoIOBuffer* info_buf,
|
| - const net::CompletionCallback& callback) {
|
| - DCHECK(!callback.is_null());
|
| - DCHECK(!IsWritePending());
|
| - DCHECK(info_buf);
|
| - DCHECK(info_buf->http_info.get());
|
| - DCHECK(!buffer_.get());
|
| - DCHECK(!info_buffer_.get());
|
| - DCHECK(info_buf->http_info->headers.get());
|
| -
|
| - info_buffer_ = info_buf;
|
| - callback_ = callback; // cleared on completion
|
| - CreateEntryIfNeededAndContinue();
|
| -}
|
| -
|
| -void AppCacheResponseWriter::ContinueWriteInfo() {
|
| - if (!entry_) {
|
| - ScheduleIOCompletionCallback(net::ERR_FAILED);
|
| - return;
|
| - }
|
| -
|
| - const bool kSkipTransientHeaders = true;
|
| - const bool kTruncated = false;
|
| - Pickle* pickle = new Pickle;
|
| - info_buffer_->http_info->Persist(pickle, kSkipTransientHeaders, kTruncated);
|
| - write_amount_ = static_cast<int>(pickle->size());
|
| - buffer_ = new WrappedPickleIOBuffer(pickle); // takes ownership of pickle
|
| - WriteRaw(kResponseInfoIndex, 0, buffer_.get(), write_amount_);
|
| -}
|
| -
|
| -void AppCacheResponseWriter::WriteData(
|
| - net::IOBuffer* buf, int buf_len, const net::CompletionCallback& callback) {
|
| - DCHECK(!callback.is_null());
|
| - DCHECK(!IsWritePending());
|
| - DCHECK(buf);
|
| - DCHECK(buf_len >= 0);
|
| - DCHECK(!buffer_.get());
|
| - DCHECK(!info_buffer_.get());
|
| -
|
| - buffer_ = buf;
|
| - write_amount_ = buf_len;
|
| - callback_ = callback; // cleared on completion
|
| - CreateEntryIfNeededAndContinue();
|
| -}
|
| -
|
| -void AppCacheResponseWriter::ContinueWriteData() {
|
| - if (!entry_) {
|
| - ScheduleIOCompletionCallback(net::ERR_FAILED);
|
| - return;
|
| - }
|
| - WriteRaw(
|
| - kResponseContentIndex, write_position_, buffer_.get(), write_amount_);
|
| -}
|
| -
|
| -void AppCacheResponseWriter::OnIOComplete(int result) {
|
| - if (result >= 0) {
|
| - DCHECK(write_amount_ == result);
|
| - if (!info_buffer_.get())
|
| - write_position_ += result;
|
| - else
|
| - info_size_ = result;
|
| - }
|
| - InvokeUserCompletionCallback(result);
|
| -}
|
| -
|
| -void AppCacheResponseWriter::CreateEntryIfNeededAndContinue() {
|
| - int rv;
|
| - AppCacheDiskCacheInterface::Entry** entry_ptr = NULL;
|
| - if (entry_) {
|
| - creation_phase_ = NO_ATTEMPT;
|
| - rv = net::OK;
|
| - } else if (!disk_cache_) {
|
| - creation_phase_ = NO_ATTEMPT;
|
| - rv = net::ERR_FAILED;
|
| - } else {
|
| - creation_phase_ = INITIAL_ATTEMPT;
|
| - entry_ptr = new AppCacheDiskCacheInterface::Entry*;
|
| - create_callback_ =
|
| - base::Bind(&AppCacheResponseWriter::OnCreateEntryComplete,
|
| - weak_factory_.GetWeakPtr(), base::Owned(entry_ptr));
|
| - rv = disk_cache_->CreateEntry(response_id_, entry_ptr, create_callback_);
|
| - }
|
| - if (rv != net::ERR_IO_PENDING)
|
| - OnCreateEntryComplete(entry_ptr, rv);
|
| -}
|
| -
|
| -void AppCacheResponseWriter::OnCreateEntryComplete(
|
| - AppCacheDiskCacheInterface::Entry** entry, int rv) {
|
| - DCHECK(info_buffer_.get() || buffer_.get());
|
| -
|
| - if (creation_phase_ == INITIAL_ATTEMPT) {
|
| - if (rv != net::OK) {
|
| - // We may try to overwrite existing entries.
|
| - creation_phase_ = DOOM_EXISTING;
|
| - rv = disk_cache_->DoomEntry(response_id_, create_callback_);
|
| - if (rv != net::ERR_IO_PENDING)
|
| - OnCreateEntryComplete(NULL, rv);
|
| - return;
|
| - }
|
| - } else if (creation_phase_ == DOOM_EXISTING) {
|
| - creation_phase_ = SECOND_ATTEMPT;
|
| - AppCacheDiskCacheInterface::Entry** entry_ptr =
|
| - new AppCacheDiskCacheInterface::Entry*;
|
| - create_callback_ =
|
| - base::Bind(&AppCacheResponseWriter::OnCreateEntryComplete,
|
| - weak_factory_.GetWeakPtr(), base::Owned(entry_ptr));
|
| - rv = disk_cache_->CreateEntry(response_id_, entry_ptr, create_callback_);
|
| - if (rv != net::ERR_IO_PENDING)
|
| - OnCreateEntryComplete(entry_ptr, rv);
|
| - return;
|
| - }
|
| -
|
| - if (!create_callback_.is_null()) {
|
| - if (rv == net::OK)
|
| - entry_ = *entry;
|
| -
|
| - create_callback_.Reset();
|
| - }
|
| -
|
| - if (info_buffer_.get())
|
| - ContinueWriteInfo();
|
| - else
|
| - ContinueWriteData();
|
| -}
|
| -
|
| -} // namespace appcache
|
|
|