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.
5 #ifndef NET_BASE_UPLOAD_FILE_ELEMENT_READER_H_
6 #define NET_BASE_UPLOAD_FILE_ELEMENT_READER_H_
8 #include "base/compiler_specific.h"
9 #include "base/files/file_path.h"
10 #include "base/gtest_prod_util.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/weak_ptr.h"
14 #include "base/time/time.h"
15 #include "net/base/upload_element_reader.h"
25 // An UploadElementReader implementation for file.
26 class NET_EXPORT UploadFileElementReader
: public UploadElementReader
{
28 // |task_runner| is used to perform file operations. It must not be NULL.
29 UploadFileElementReader(base::TaskRunner
* task_runner
,
30 const base::FilePath
& path
,
33 const base::Time
& expected_modification_time
);
34 virtual ~UploadFileElementReader();
36 const base::FilePath
& path() const { return path_
; }
37 uint64
range_offset() const { return range_offset_
; }
38 uint64
range_length() const { return range_length_
; }
39 const base::Time
& expected_modification_time() const {
40 return expected_modification_time_
;
43 // UploadElementReader overrides:
44 virtual const UploadFileElementReader
* AsFileReader() const OVERRIDE
;
45 virtual int Init(const CompletionCallback
& callback
) OVERRIDE
;
46 virtual uint64
GetContentLength() const OVERRIDE
;
47 virtual uint64
BytesRemaining() const OVERRIDE
;
48 virtual int Read(IOBuffer
* buf
,
50 const CompletionCallback
& callback
) OVERRIDE
;
53 // Deletes FileStream with |task_runner| to avoid blocking the IO thread.
54 // This class is used as a template argument of scoped_ptr.
55 class FileStreamDeleter
{
57 explicit FileStreamDeleter(base::TaskRunner
* task_runner
);
59 void operator() (FileStream
* file_stream
) const;
62 scoped_refptr
<base::TaskRunner
> task_runner_
;
65 typedef scoped_ptr
<FileStream
, FileStreamDeleter
> ScopedFileStreamPtr
;
67 FRIEND_TEST_ALL_PREFIXES(UploadDataStreamTest
, FileSmallerThanLength
);
68 FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionTest
,
69 UploadFileSmallerThanLength
);
70 FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionSpdy2Test
,
71 UploadFileSmallerThanLength
);
72 FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionSpdy3Test
,
73 UploadFileSmallerThanLength
);
75 // Resets this instance to the uninitialized state.
78 // This method is used to implement Init().
79 void OnInitCompleted(ScopedFileStreamPtr
* file_stream
,
80 uint64
* content_length
,
81 const CompletionCallback
& callback
,
84 // This method is used to implement Read().
85 void OnReadCompleted(ScopedFileStreamPtr file_stream
,
86 const CompletionCallback
& callback
,
89 // Sets an value to override the result for GetContentLength().
91 struct NET_EXPORT_PRIVATE ScopedOverridingContentLengthForTests
{
92 ScopedOverridingContentLengthForTests(uint64 value
);
93 ~ScopedOverridingContentLengthForTests();
96 scoped_refptr
<base::TaskRunner
> task_runner_
;
97 const base::FilePath path_
;
98 const uint64 range_offset_
;
99 const uint64 range_length_
;
100 const base::Time expected_modification_time_
;
101 ScopedFileStreamPtr file_stream_
;
102 uint64 content_length_
;
103 uint64 bytes_remaining_
;
104 base::WeakPtrFactory
<UploadFileElementReader
> weak_ptr_factory_
;
106 DISALLOW_COPY_AND_ASSIGN(UploadFileElementReader
);
109 // An UploadElementReader implementation for file which performs file operation
111 // Use this class only if the thread is IO allowed.
112 class NET_EXPORT UploadFileElementReaderSync
: public UploadElementReader
{
114 UploadFileElementReaderSync(const base::FilePath
& path
,
117 const base::Time
& expected_modification_time
);
118 virtual ~UploadFileElementReaderSync();
120 // UploadElementReader overrides:
121 virtual int Init(const CompletionCallback
& callback
) OVERRIDE
;
122 virtual uint64
GetContentLength() const OVERRIDE
;
123 virtual uint64
BytesRemaining() const OVERRIDE
;
124 virtual int Read(IOBuffer
* buf
,
126 const CompletionCallback
& callback
) OVERRIDE
;
129 const base::FilePath path_
;
130 const uint64 range_offset_
;
131 const uint64 range_length_
;
132 const base::Time expected_modification_time_
;
133 scoped_ptr
<FileStream
> file_stream_
;
134 uint64 content_length_
;
135 uint64 bytes_remaining_
;
137 DISALLOW_COPY_AND_ASSIGN(UploadFileElementReaderSync
);
142 #endif // NET_BASE_UPLOAD_FILE_ELEMENT_READER_H_