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 18namespace base { 19class TaskRunner; 20} 21 22namespace net { 23 24class FileStream; 25 26// An UploadElementReader implementation for file. 27class 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 37 const base::FilePath& path() const { return path_; } 38 uint64 range_offset() const { return range_offset_; } 39 uint64 range_length() const { return range_length_; } 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