1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_URL_REQUEST_URL_REQUEST_FILE_JOB_H_ 6 #define NET_URL_REQUEST_URL_REQUEST_FILE_JOB_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/files/file_path.h" 12 #include "base/memory/ref_counted.h" 13 #include "base/memory/weak_ptr.h" 14 #include "net/base/net_export.h" 15 #include "net/http/http_byte_range.h" 16 #include "net/url_request/url_request.h" 17 #include "net/url_request/url_request_job.h" 18 19 namespace base{ 20 struct PlatformFileInfo; 21 class TaskRunner; 22 } 23 namespace file_util { 24 struct FileInfo; 25 } 26 27 namespace net { 28 29 class FileStream; 30 31 // A request job that handles reading file URLs 32 class NET_EXPORT URLRequestFileJob : public URLRequestJob { 33 public: 34 URLRequestFileJob(URLRequest* request, 35 NetworkDelegate* network_delegate, 36 const base::FilePath& file_path, 37 const scoped_refptr<base::TaskRunner>& file_task_runner); 38 39 // URLRequestJob: 40 virtual void Start() OVERRIDE; 41 virtual void Kill() OVERRIDE; 42 virtual bool ReadRawData(IOBuffer* buf, 43 int buf_size, 44 int* bytes_read) OVERRIDE; 45 virtual bool IsRedirectResponse(GURL* location, 46 int* http_status_code) OVERRIDE; 47 virtual Filter* SetupFilter() const OVERRIDE; 48 virtual bool GetMimeType(std::string* mime_type) const OVERRIDE; 49 virtual void SetExtraRequestHeaders( 50 const HttpRequestHeaders& headers) OVERRIDE; 51 52 protected: 53 virtual ~URLRequestFileJob(); 54 55 // The OS-specific full path name of the file 56 base::FilePath file_path_; 57 58 private: 59 // Meta information about the file. It's used as a member in the 60 // URLRequestFileJob and also passed between threads because disk access is 61 // necessary to obtain it. 62 struct FileMetaInfo { 63 FileMetaInfo(); 64 65 // Size of the file. 66 int64 file_size; 67 // Mime type associated with the file. 68 std::string mime_type; 69 // Result returned from GetMimeTypeFromFile(), i.e. flag showing whether 70 // obtaining of the mime type was successful. 71 bool mime_type_result; 72 // Flag showing whether the file exists. 73 bool file_exists; 74 // Flag showing whether the file name actually refers to a directory. 75 bool is_directory; 76 }; 77 78 // Fetches file info on a background thread. 79 static void FetchMetaInfo(const base::FilePath& file_path, 80 FileMetaInfo* meta_info); 81 82 // Callback after fetching file info on a background thread. 83 void DidFetchMetaInfo(const FileMetaInfo* meta_info); 84 85 // Callback after opening file on a background thread. 86 void DidOpen(int result); 87 88 // Callback after seeking to the beginning of |byte_range_| in the file 89 // on a background thread. 90 void DidSeek(int64 result); 91 92 // Callback after data is asynchronously read from the file. 93 void DidRead(int result); 94 95 scoped_ptr<FileStream> stream_; 96 FileMetaInfo meta_info_; 97 const scoped_refptr<base::TaskRunner> file_task_runner_; 98 99 HttpByteRange byte_range_; 100 int64 remaining_bytes_; 101 102 base::WeakPtrFactory<URLRequestFileJob> weak_ptr_factory_; 103 104 DISALLOW_COPY_AND_ASSIGN(URLRequestFileJob); 105 }; 106 107 } // namespace net 108 109 #endif // NET_URL_REQUEST_URL_REQUEST_FILE_JOB_H_ 110