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_BASE_UPLOAD_FILE_ELEMENT_READER_H_ 6 #define NET_BASE_UPLOAD_FILE_ELEMENT_READER_H_ 7 8 #include "base/compiler_specific.h" 9 #include "base/files/file.h" 10 #include "base/files/file_path.h" 11 #include "base/gtest_prod_util.h" 12 #include "base/memory/ref_counted.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/weak_ptr.h" 15 #include "base/time/time.h" 16 #include "net/base/upload_element_reader.h" 17 18 namespace base { 19 class TaskRunner; 20 } 21 22 namespace net { 23 24 class FileStream; 25 26 // An UploadElementReader implementation for file. 27 class NET_EXPORT UploadFileElementReader : public UploadElementReader { 28 public: 29 // |task_runner| is used to perform file operations. It must not be NULL. 30 UploadFileElementReader(base::TaskRunner* task_runner, 31 const base::FilePath& path, 32 uint64 range_offset, 33 uint64 range_length, 34 const base::Time& expected_modification_time); 35 virtual ~UploadFileElementReader(); 36 path()37 const base::FilePath& path() const { return path_; } range_offset()38 uint64 range_offset() const { return range_offset_; } range_length()39 uint64 range_length() const { return range_length_; } expected_modification_time()40 const base::Time& expected_modification_time() const { 41 return expected_modification_time_; 42 } 43 44 // UploadElementReader overrides: 45 virtual const UploadFileElementReader* AsFileReader() const OVERRIDE; 46 virtual int Init(const CompletionCallback& callback) OVERRIDE; 47 virtual uint64 GetContentLength() const OVERRIDE; 48 virtual uint64 BytesRemaining() const OVERRIDE; 49 virtual int Read(IOBuffer* buf, 50 int buf_length, 51 const CompletionCallback& callback) OVERRIDE; 52 53 private: 54 FRIEND_TEST_ALL_PREFIXES(UploadDataStreamTest, FileSmallerThanLength); 55 FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionTest, 56 UploadFileSmallerThanLength); 57 58 // Resets this instance to the uninitialized state. 59 void Reset(); 60 61 // These methods are used to implement Init(). 62 void OnOpenCompleted(const CompletionCallback& callback, int result); 63 void OnSeekCompleted(const CompletionCallback& callback, int64 result); 64 void OnGetFileInfoCompleted(const CompletionCallback& callback, 65 base::File::Info* file_info, 66 bool result); 67 68 // This method is used to implement Read(). 69 int OnReadCompleted(const CompletionCallback& callback, int result); 70 71 // Sets an value to override the result for GetContentLength(). 72 // Used for tests. 73 struct NET_EXPORT_PRIVATE ScopedOverridingContentLengthForTests { 74 ScopedOverridingContentLengthForTests(uint64 value); 75 ~ScopedOverridingContentLengthForTests(); 76 }; 77 78 scoped_refptr<base::TaskRunner> task_runner_; 79 const base::FilePath path_; 80 const uint64 range_offset_; 81 const uint64 range_length_; 82 const base::Time expected_modification_time_; 83 scoped_ptr<FileStream> file_stream_; 84 uint64 content_length_; 85 uint64 bytes_remaining_; 86 base::WeakPtrFactory<UploadFileElementReader> weak_ptr_factory_; 87 88 DISALLOW_COPY_AND_ASSIGN(UploadFileElementReader); 89 }; 90 91 } // namespace net 92 93 #endif // NET_BASE_UPLOAD_FILE_ELEMENT_READER_H_ 94