blob: 226ebf1696f81b29a298e11b3ff3b5f184d9b01a [file] [log] [blame]
// Copyright 2015 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 CONTENT_BROWSER_CACHE_STORAGE_CACHE_STORAGE_BLOB_TO_DISK_CACHE_H_
#define CONTENT_BROWSER_CACHE_STORAGE_CACHE_STORAGE_BLOB_TO_DISK_CACHE_H_
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "content/common/content_export.h"
#include "net/disk_cache/disk_cache.h"
#include "net/url_request/url_request.h"
#include "net/url_request/url_request_context_getter_observer.h"
namespace net {
class IOBufferWithSize;
class URLRequestContextGetter;
}
namespace storage {
class BlobDataHandle;
}
namespace content {
// Streams data from a blob and writes it to a given disk_cache::Entry.
class CONTENT_EXPORT CacheStorageBlobToDiskCache
: public net::URLRequest::Delegate,
public net::URLRequestContextGetterObserver {
public:
using EntryAndBoolCallback =
base::Callback<void(disk_cache::ScopedEntryPtr, bool)>;
// The buffer size used for reading from blobs and writing to disk cache.
static const int kBufferSize;
CacheStorageBlobToDiskCache();
~CacheStorageBlobToDiskCache() override;
// Writes the body of |blob_data_handle| to |entry| with index
// |disk_cache_body_index|. |entry| is passed to the callback once complete.
// Only call this once per instantiation of CacheStorageBlobToDiskCache.
void StreamBlobToCache(
disk_cache::ScopedEntryPtr entry,
int disk_cache_body_index,
const scoped_refptr<net::URLRequestContextGetter>& request_context_getter,
scoped_ptr<storage::BlobDataHandle> blob_data_handle,
const EntryAndBoolCallback& callback);
// net::URLRequest::Delegate overrides for reading blobs.
void OnResponseStarted(net::URLRequest* request) override;
void OnReadCompleted(net::URLRequest* request, int bytes_read) override;
void OnReceivedRedirect(net::URLRequest* request,
const net::RedirectInfo& redirect_info,
bool* defer_redirect) override;
void OnAuthRequired(net::URLRequest* request,
net::AuthChallengeInfo* auth_info) override;
void OnCertificateRequested(
net::URLRequest* request,
net::SSLCertRequestInfo* cert_request_info) override;
void OnSSLCertificateError(net::URLRequest* request,
const net::SSLInfo& ssl_info,
bool fatal) override;
void OnBeforeNetworkStart(net::URLRequest* request, bool* defer) override;
// URLRequestContextGetterObserver override for canceling requests just
// before the URLRequestContext is destroyed.
void OnContextShuttingDown() override;
protected:
// Virtual for testing.
virtual void ReadFromBlob();
private:
void DidWriteDataToEntry(int expected_bytes, int rv);
void RunCallbackAndRemoveObserver(bool success);
int cache_entry_offset_;
disk_cache::ScopedEntryPtr entry_;
scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
int disk_cache_body_index_;
scoped_ptr<net::URLRequest> blob_request_;
EntryAndBoolCallback callback_;
scoped_refptr<net::IOBufferWithSize> buffer_;
base::WeakPtrFactory<CacheStorageBlobToDiskCache> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(CacheStorageBlobToDiskCache);
};
} // namespace content
#endif // CONTENT_BROWSER_CACHE_STORAGE_CACHE_STORAGE_BLOB_TO_DISK_CACHE_H_