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

Unified Diff: webkit/browser/appcache/appcache_response.cc

Issue 344493002: Move all remaining appcache-related code to content namespace (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 6 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698