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