15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/upload_bytes_element_reader.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UploadBytesElementReader::UploadBytesElementReader(const char* bytes,
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   uint64 length)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : bytes_(bytes),
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      length_(length),
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      offset_(0) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UploadBytesElementReader::~UploadBytesElementReader() {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const UploadBytesElementReader*
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UploadBytesElementReader::AsBytesReader() const {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return this;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int UploadBytesElementReader::Init(const CompletionCallback& callback) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  offset_ = 0;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OK;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 UploadBytesElementReader::GetContentLength() const {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return length_;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint64 UploadBytesElementReader::BytesRemaining() const {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return length_ - offset_;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool UploadBytesElementReader::IsInMemory() const {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int UploadBytesElementReader::Read(IOBuffer* buf,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int buf_length,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const CompletionCallback& callback) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_LT(0, buf_length);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t num_bytes_to_read =
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::min(BytesRemaining(), static_cast<uint64>(buf_length));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if we have anything to copy first, because we are getting
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the address of an element in |bytes_| and that will throw an
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exception if |bytes_| is an empty vector.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (num_bytes_to_read > 0)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(buf->data(), bytes_ + offset_, num_bytes_to_read);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  offset_ += num_bytes_to_read;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return num_bytes_to_read;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UploadOwnedBytesElementReader::UploadOwnedBytesElementReader(
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<char>* data)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : UploadBytesElementReader(vector_as_array(data), data->size()) {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_.swap(*data);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UploadOwnedBytesElementReader::~UploadOwnedBytesElementReader() {}
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UploadOwnedBytesElementReader*
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UploadOwnedBytesElementReader::CreateWithString(const std::string& string) {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<char> data(string.begin(), string.end());
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new UploadOwnedBytesElementReader(&data);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
80