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 #include "net/base/upload_bytes_element_reader.h"
7 #include "base/logging.h"
8 #include "base/stl_util.h"
9 #include "net/base/io_buffer.h"
10 #include "net/base/net_errors.h"
14 UploadBytesElementReader::UploadBytesElementReader(const char* bytes
,
21 UploadBytesElementReader::~UploadBytesElementReader() {
24 const UploadBytesElementReader
*
25 UploadBytesElementReader::AsBytesReader() const {
29 int UploadBytesElementReader::Init(const CompletionCallback
& callback
) {
34 uint64
UploadBytesElementReader::GetContentLength() const {
38 uint64
UploadBytesElementReader::BytesRemaining() const {
39 return length_
- offset_
;
42 bool UploadBytesElementReader::IsInMemory() const {
46 int UploadBytesElementReader::Read(IOBuffer
* buf
,
48 const CompletionCallback
& callback
) {
49 DCHECK_LT(0, buf_length
);
51 const size_t num_bytes_to_read
=
52 std::min(BytesRemaining(), static_cast<uint64
>(buf_length
));
54 // Check if we have anything to copy first, because we are getting
55 // the address of an element in |bytes_| and that will throw an
56 // exception if |bytes_| is an empty vector.
57 if (num_bytes_to_read
> 0)
58 memcpy(buf
->data(), bytes_
+ offset_
, num_bytes_to_read
);
60 offset_
+= num_bytes_to_read
;
61 return num_bytes_to_read
;
65 UploadOwnedBytesElementReader::UploadOwnedBytesElementReader(
66 std::vector
<char>* data
)
67 : UploadBytesElementReader(vector_as_array(data
), data
->size()) {
71 UploadOwnedBytesElementReader::~UploadOwnedBytesElementReader() {}
73 UploadOwnedBytesElementReader
*
74 UploadOwnedBytesElementReader::CreateWithString(const std::string
& string
) {
75 std::vector
<char> data(string
.begin(), string
.end());
76 return new UploadOwnedBytesElementReader(&data
);