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_ELEMENT_H_
6 #define NET_BASE_UPLOAD_ELEMENT_H_
10 #include "base/basictypes.h"
11 #include "base/files/file_path.h"
12 #include "base/time/time.h"
13 #include "net/base/net_export.h"
17 // A class representing an element contained by UploadData.
18 class NET_EXPORT UploadElement
{
28 Type
type() const { return type_
; }
30 const char* bytes() const { return bytes_start_
? bytes_start_
: &buf_
[0]; }
31 uint64
bytes_length() const { return buf_
.size() + bytes_length_
; }
32 const base::FilePath
& file_path() const { return file_path_
; }
33 uint64
file_range_offset() const { return file_range_offset_
; }
34 uint64
file_range_length() const { return file_range_length_
; }
35 // If NULL time is returned, we do not do the check.
36 const base::Time
& expected_file_modification_time() const {
37 return expected_file_modification_time_
;
40 void SetToBytes(const char* bytes
, int bytes_len
) {
42 buf_
.assign(bytes
, bytes
+ bytes_len
);
45 // This does not copy the given data and the caller should make sure
46 // the data is secured somewhere else (e.g. by attaching the data
47 // using SetUserData).
48 void SetToSharedBytes(const char* bytes
, int bytes_len
) {
51 bytes_length_
= bytes_len
;
54 void SetToFilePath(const base::FilePath
& path
) {
55 SetToFilePathRange(path
, 0, kuint64max
, base::Time());
58 // If expected_modification_time is NULL, we do not check for the file
59 // change. Also note that the granularity for comparison is time_t, not
60 // the full precision.
61 void SetToFilePathRange(const base::FilePath
& path
,
62 uint64 offset
, uint64 length
,
63 const base::Time
& expected_modification_time
) {
66 file_range_offset_
= offset
;
67 file_range_length_
= length
;
68 expected_file_modification_time_
= expected_modification_time
;
73 std::vector
<char> buf_
;
74 const char* bytes_start_
;
76 base::FilePath file_path_
;
77 uint64 file_range_offset_
;
78 uint64 file_range_length_
;
79 base::Time expected_file_modification_time_
;
81 DISALLOW_COPY_AND_ASSIGN(UploadElement
);
84 #if defined(UNIT_TEST)
85 inline bool operator==(const UploadElement
& a
,
86 const UploadElement
& b
) {
87 if (a
.type() != b
.type())
89 if (a
.type() == UploadElement::TYPE_BYTES
)
90 return a
.bytes_length() == b
.bytes_length() &&
91 memcmp(a
.bytes(), b
.bytes(), b
.bytes_length()) == 0;
92 if (a
.type() == UploadElement::TYPE_FILE
) {
93 return a
.file_path() == b
.file_path() &&
94 a
.file_range_offset() == b
.file_range_offset() &&
95 a
.file_range_length() == b
.file_range_length() &&
96 a
.expected_file_modification_time() ==
97 b
.expected_file_modification_time();
102 inline bool operator!=(const UploadElement
& a
,
103 const UploadElement
& b
) {
106 #endif // defined(UNIT_TEST)
110 #endif // NET_BASE_UPLOAD_ELEMENT_H_