Home | History | Annotate | Download | only in base
      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