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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_URL_REQUEST_URL_REQUEST_FILE_JOB_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_URL_REQUEST_URL_REQUEST_FILE_JOB_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/memory/ref_counted.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_byte_range.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace base {
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class TaskRunner;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace file_util {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FileInfo;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileStream;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A request job that handles reading file URLs
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT URLRequestFileJob : public URLRequestJob {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestFileJob(URLRequest* request,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    NetworkDelegate* network_delegate,
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    const base::FilePath& file_path,
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    const scoped_refptr<base::TaskRunner>& file_task_runner);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLRequestJob:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Start() OVERRIDE;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Kill() OVERRIDE;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ReadRawData(IOBuffer* buf,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int buf_size,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int* bytes_read) OVERRIDE;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsRedirectResponse(GURL* location,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int* http_status_code) OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual Filter* SetupFilter() const OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetMimeType(std::string* mime_type) const OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetExtraRequestHeaders(
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const HttpRequestHeaders& headers) OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // An interface for subclasses who wish to monitor read operations.
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void OnSeekComplete(int64 result);
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void OnReadComplete(net::IOBuffer* buf, int result);
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~URLRequestFileJob();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int64 remaining_bytes() const { return remaining_bytes_; }
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The OS-specific full path name of the file
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath file_path_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Meta information about the file. It's used as a member in the
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // URLRequestFileJob and also passed between threads because disk access is
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // necessary to obtain it.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct FileMetaInfo {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FileMetaInfo();
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Size of the file.
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 file_size;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Mime type associated with the file.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string mime_type;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Result returned from GetMimeTypeFromFile(), i.e. flag showing whether
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // obtaining of the mime type was successful.
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool mime_type_result;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Flag showing whether the file exists.
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool file_exists;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Flag showing whether the file name actually refers to a directory.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool is_directory;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fetches file info on a background thread.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void FetchMetaInfo(const base::FilePath& file_path,
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            FileMetaInfo* meta_info);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback after fetching file info on a background thread.
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DidFetchMetaInfo(const FileMetaInfo* meta_info);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Callback after opening file on a background thread.
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DidOpen(int result);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Callback after seeking to the beginning of |byte_range_| in the file
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // on a background thread.
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DidSeek(int64 result);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Callback after data is asynchronously read from the file into |buf|.
98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void DidRead(scoped_refptr<net::IOBuffer> buf, int result);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileStream> stream_;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FileMetaInfo meta_info_;
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const scoped_refptr<base::TaskRunner> file_task_runner_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpByteRange byte_range_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 remaining_bytes_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtrFactory<URLRequestFileJob> weak_ptr_factory_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(URLRequestFileJob);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_URL_REQUEST_URL_REQUEST_FILE_JOB_H_
115