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 #include "net/base/upload_bytes_element_reader.h" 6 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" 11 12 namespace net { 13 14 UploadBytesElementReader::UploadBytesElementReader(const char* bytes, 15 uint64 length) 16 : bytes_(bytes), 17 length_(length), 18 offset_(0) { 19 } 20 21 UploadBytesElementReader::~UploadBytesElementReader() { 22 } 23 24 const UploadBytesElementReader* 25 UploadBytesElementReader::AsBytesReader() const { 26 return this; 27 } 28 29 int UploadBytesElementReader::Init(const CompletionCallback& callback) { 30 offset_ = 0; 31 return OK; 32 } 33 34 uint64 UploadBytesElementReader::GetContentLength() const { 35 return length_; 36 } 37 38 uint64 UploadBytesElementReader::BytesRemaining() const { 39 return length_ - offset_; 40 } 41 42 bool UploadBytesElementReader::IsInMemory() const { 43 return true; 44 } 45 46 int UploadBytesElementReader::Read(IOBuffer* buf, 47 int buf_length, 48 const CompletionCallback& callback) { 49 DCHECK_LT(0, buf_length); 50 51 const size_t num_bytes_to_read = 52 std::min(BytesRemaining(), static_cast<uint64>(buf_length)); 53 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); 59 60 offset_ += num_bytes_to_read; 61 return num_bytes_to_read; 62 } 63 64 65 UploadOwnedBytesElementReader::UploadOwnedBytesElementReader( 66 std::vector<char>* data) 67 : UploadBytesElementReader(vector_as_array(data), data->size()) { 68 data_.swap(*data); 69 } 70 71 UploadOwnedBytesElementReader::~UploadOwnedBytesElementReader() {} 72 73 UploadOwnedBytesElementReader* 74 UploadOwnedBytesElementReader::CreateWithString(const std::string& string) { 75 std::vector<char> data(string.begin(), string.end()); 76 return new UploadOwnedBytesElementReader(&data); 77 } 78 79 } // namespace net 80