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#ifndef NET_BASE_UPLOAD_BYTES_ELEMENT_READER_H_
6#define NET_BASE_UPLOAD_BYTES_ELEMENT_READER_H_
7
8#include <string>
9#include <vector>
10
11#include "base/basictypes.h"
12#include "base/compiler_specific.h"
13#include "net/base/upload_element_reader.h"
14
15namespace net {
16
17// An UploadElementReader implementation for bytes.
18// |data| should outlive this class because this class does not take the
19// ownership of the data.
20class NET_EXPORT UploadBytesElementReader : public UploadElementReader {
21 public:
22  UploadBytesElementReader(const char* bytes, uint64 length);
23  virtual ~UploadBytesElementReader();
24
25  const char* bytes() const { return bytes_; }
26  uint64 length() const { return length_; }
27
28  // UploadElementReader overrides:
29  virtual const UploadBytesElementReader* AsBytesReader() const OVERRIDE;
30  virtual int Init(const CompletionCallback& callback) OVERRIDE;
31  virtual uint64 GetContentLength() const OVERRIDE;
32  virtual uint64 BytesRemaining() const OVERRIDE;
33  virtual bool IsInMemory() const OVERRIDE;
34  virtual int Read(IOBuffer* buf,
35                   int buf_length,
36                   const CompletionCallback& callback) OVERRIDE;
37
38 private:
39  const char* const bytes_;
40  const uint64 length_;
41  uint64 offset_;
42
43  DISALLOW_COPY_AND_ASSIGN(UploadBytesElementReader);
44};
45
46// A subclass of UplodBytesElementReader which owns the data given as a vector.
47class NET_EXPORT UploadOwnedBytesElementReader
48    : public UploadBytesElementReader {
49 public:
50  // |data| is cleared by this ctor.
51  explicit UploadOwnedBytesElementReader(std::vector<char>* data);
52  virtual ~UploadOwnedBytesElementReader();
53
54  // Creates UploadOwnedBytesElementReader with a string.
55  static UploadOwnedBytesElementReader* CreateWithString(
56      const std::string& string);
57
58 private:
59  std::vector<char> data_;
60
61  DISALLOW_COPY_AND_ASSIGN(UploadOwnedBytesElementReader);
62};
63
64}  // namespace net
65
66#endif  // NET_BASE_UPLOAD_BYTES_ELEMENT_READER_H_
67