// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef GARNET_BIN_HTTP_UPLOAD_ELEMENT_READER_H_
#define GARNET_BIN_HTTP_UPLOAD_ELEMENT_READER_H_

#include <array>
#include <limits>

#include <src/lib/fxl/macros.h>
#include <lib/zx/socket.h>
#include <lib/zx/vmo.h>

namespace http {

class UploadElementReader {
 public:
  static constexpr size_t BUFSIZE = 1024;
  static constexpr size_t kUnknownSize = std::numeric_limits<size_t>::max();

  UploadElementReader();
  virtual ~UploadElementReader();

  zx_status_t err() const { return err_; }

  // may produce kUnknownSize
  virtual size_t size() = 0;

  // returns true if and only if content was read or there is potentially more
  // to read
  virtual bool ReadAvailable(std::ostream* os) = 0;

 protected:
  zx_status_t err_;

 private:
  FXL_DISALLOW_COPY_AND_ASSIGN(UploadElementReader);
};

class SocketUploadElementReader : public UploadElementReader {
 public:
  SocketUploadElementReader(zx::socket socket);
  ~SocketUploadElementReader() override;

  // always kUnknownSize
  size_t size() override;
  bool ReadAvailable(std::ostream* os) override;

 private:
  zx::socket socket_;
  std::array<char, BUFSIZE> buf_;
};

class VmoUploadElementReader : public UploadElementReader {
 public:
  VmoUploadElementReader(zx::vmo vmo);
  VmoUploadElementReader(zx::vmo vmo, uint64_t size);
  ~VmoUploadElementReader() override;

  size_t size() override;
  bool ReadAvailable(std::ostream* os) override;

 private:
  zx::vmo vmo_;
  uint64_t size_;
  uint64_t offset_;
  std::array<char, BUFSIZE> buf_;
};

}  // namespace http

#endif  // GARNET_BIN_HTTP_UPLOAD_ELEMENT_READER_H_
