15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef STORAGE_BROWSER_BLOB_BLOB_URL_REQUEST_JOB_H_
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define STORAGE_BROWSER_BLOB_BLOB_URL_REQUEST_JOB_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <map>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_byte_range.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/http/http_status_code.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/storage_browser_export.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/blob/blob_data.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageLoopProxy;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileSystemContext;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DrainableIOBuffer;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IOBuffer;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileStreamReader;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A request job that handles reading blob URLs.
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass STORAGE_EXPORT BlobURLRequestJob
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public net::URLRequestJob {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlobURLRequestJob(net::URLRequest* request,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    net::NetworkDelegate* network_delegate,
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const scoped_refptr<BlobData>& blob_data,
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                    storage::FileSystemContext* file_system_context,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    base::MessageLoopProxy* resolving_message_loop_proxy);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // net::URLRequestJob methods.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Start() OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Kill() OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ReadRawData(net::IOBuffer* buf,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int buf_size,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int* bytes_read) OVERRIDE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetMimeType(std::string* mime_type) const OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetResponseInfo(net::HttpResponseInfo* info) OVERRIDE;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetResponseCode() const OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetExtraRequestHeaders(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::HttpRequestHeaders& headers) OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BlobURLRequestJob();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<size_t, FileStreamReader*> IndexToReaderMap;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For preparing for read: get the size, apply the range and perform seek.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidStart();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool AddItemLength(size_t index, int64 item_length);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CountSize();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidCountSize(int error);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidGetFileItemLength(size_t index, int64 result);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Seek(int64 offset);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For reading the blob.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ReadLoop(int* bytes_read);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ReadItem();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AdvanceItem();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AdvanceBytesRead(int result);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ReadBytesItem(const BlobData::Item& item, int bytes_to_read);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ReadFileItem(FileStreamReader* reader, int bytes_to_read);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidReadFile(int result);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteCurrentFileReader();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ComputeBytesToRead() const;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int BytesReadCompleted();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // These methods convert the result of blob data reading into response headers
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // and pass it to URLRequestJob's NotifyDone() or NotifyHeadersComplete().
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifySuccess();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyFailure(int);
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void HeadersCompleted(net::HttpStatusCode status_code);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a FileStreamReader for a blob item at |index|.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the item at |index| is not of file this returns NULL.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileStreamReader* GetFileStreamReader(size_t index);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a FileStreamReader for the item at |index| with additional_offset.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateFileStreamReader(size_t index, int64 additional_offset);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<BlobData> blob_data_;
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Variables for controlling read from |blob_data_|.
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<storage::FileSystemContext> file_system_context_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> file_thread_proxy_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int64> item_length_list_;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 total_size_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 remaining_bytes_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pending_get_file_info_count_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IndexToReaderMap index_to_reader_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t current_item_index_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 current_item_offset_;
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Holds the buffer for read data with the IOBuffer interface.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::DrainableIOBuffer> read_buf_;
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Is set when NotifyFailure() is called and reset when DidStart is called.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool error_;
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool byte_range_set_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpByteRange byte_range_;
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::HttpResponseInfo> response_info_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::WeakPtrFactory<BlobURLRequestJob> weak_factory_;
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BlobURLRequestJob);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace storage
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // STORAGE_BROWSER_BLOB_BLOB_URL_REQUEST_JOB_H_
130