1 // Copyright 2012 The Chromium Authors 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/check_op.h" 8 #include "base/numerics/safe_conversions.h" 9 #include "net/base/io_buffer.h" 10 #include "net/base/net_errors.h" 11 12 namespace net { 13 UploadBytesElementReader(base::span<const uint8_t> bytes)14UploadBytesElementReader::UploadBytesElementReader( 15 base::span<const uint8_t> bytes) 16 : bytes_(bytes) {} 17 18 UploadBytesElementReader::~UploadBytesElementReader() = default; 19 20 const UploadBytesElementReader* AsBytesReader() const21UploadBytesElementReader::AsBytesReader() const { 22 return this; 23 } 24 Init(CompletionOnceCallback callback)25int UploadBytesElementReader::Init(CompletionOnceCallback callback) { 26 offset_ = 0; 27 return OK; 28 } 29 GetContentLength() const30uint64_t UploadBytesElementReader::GetContentLength() const { 31 return bytes_.size(); 32 } 33 BytesRemaining() const34uint64_t UploadBytesElementReader::BytesRemaining() const { 35 return bytes_.size() - offset_; 36 } 37 IsInMemory() const38bool UploadBytesElementReader::IsInMemory() const { 39 return true; 40 } 41 Read(IOBuffer * buf,int buf_length,CompletionOnceCallback callback)42int UploadBytesElementReader::Read(IOBuffer* buf, 43 int buf_length, 44 CompletionOnceCallback callback) { 45 base::span<const uint8_t> bytes_to_read = 46 bytes_.subspan(offset_, std::min(static_cast<size_t>(BytesRemaining()), 47 base::checked_cast<size_t>(buf_length))); 48 if (!bytes_to_read.empty()) { 49 buf->span().copy_prefix_from(bytes_to_read); 50 } 51 52 offset_ += bytes_to_read.size(); 53 return bytes_to_read.size(); 54 } 55 UploadOwnedBytesElementReader(std::vector<char> * data)56UploadOwnedBytesElementReader::UploadOwnedBytesElementReader( 57 std::vector<char>* data) 58 : UploadBytesElementReader(base::as_byte_span(*data)) { 59 data_.swap(*data); 60 } 61 62 UploadOwnedBytesElementReader::~UploadOwnedBytesElementReader() = default; 63 64 std::unique_ptr<UploadOwnedBytesElementReader> CreateWithString(const std::string & string)65UploadOwnedBytesElementReader::CreateWithString(const std::string& string) { 66 std::vector<char> data(string.begin(), string.end()); 67 return std::make_unique<UploadOwnedBytesElementReader>(&data); 68 } 69 70 } // namespace net 71