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 12namespace net { 13 14UploadBytesElementReader::UploadBytesElementReader(const char* bytes, 15 uint64 length) 16 : bytes_(bytes), 17 length_(length), 18 offset_(0) { 19} 20 21UploadBytesElementReader::~UploadBytesElementReader() { 22} 23 24const UploadBytesElementReader* 25UploadBytesElementReader::AsBytesReader() const { 26 return this; 27} 28 29int UploadBytesElementReader::Init(const CompletionCallback& callback) { 30 offset_ = 0; 31 return OK; 32} 33 34uint64 UploadBytesElementReader::GetContentLength() const { 35 return length_; 36} 37 38uint64 UploadBytesElementReader::BytesRemaining() const { 39 return length_ - offset_; 40} 41 42bool UploadBytesElementReader::IsInMemory() const { 43 return true; 44} 45 46int 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 65UploadOwnedBytesElementReader::UploadOwnedBytesElementReader( 66 std::vector<char>* data) 67 : UploadBytesElementReader(vector_as_array(data), data->size()) { 68 data_.swap(*data); 69} 70 71UploadOwnedBytesElementReader::~UploadOwnedBytesElementReader() {} 72 73UploadOwnedBytesElementReader* 74UploadOwnedBytesElementReader::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