• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
UploadBytesElementReader(const char * bytes,uint64 length)14 UploadBytesElementReader::UploadBytesElementReader(const char* bytes,
15                                                    uint64 length)
16     : bytes_(bytes),
17       length_(length),
18       offset_(0) {
19 }
20 
~UploadBytesElementReader()21 UploadBytesElementReader::~UploadBytesElementReader() {
22 }
23 
24 const UploadBytesElementReader*
AsBytesReader() const25 UploadBytesElementReader::AsBytesReader() const {
26   return this;
27 }
28 
Init(const CompletionCallback & callback)29 int UploadBytesElementReader::Init(const CompletionCallback& callback) {
30   offset_ = 0;
31   return OK;
32 }
33 
GetContentLength() const34 uint64 UploadBytesElementReader::GetContentLength() const {
35   return length_;
36 }
37 
BytesRemaining() const38 uint64 UploadBytesElementReader::BytesRemaining() const {
39   return length_ - offset_;
40 }
41 
IsInMemory() const42 bool UploadBytesElementReader::IsInMemory() const {
43   return true;
44 }
45 
Read(IOBuffer * buf,int buf_length,const CompletionCallback & callback)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 
UploadOwnedBytesElementReader(std::vector<char> * data)65 UploadOwnedBytesElementReader::UploadOwnedBytesElementReader(
66     std::vector<char>* data)
67     : UploadBytesElementReader(vector_as_array(data), data->size()) {
68   data_.swap(*data);
69 }
70 
~UploadOwnedBytesElementReader()71 UploadOwnedBytesElementReader::~UploadOwnedBytesElementReader() {}
72 
73 UploadOwnedBytesElementReader*
CreateWithString(const std::string & string)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