// Copyright 2019 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 SRC_BRINGUP_BIN_NETSVC_NETCP_H_
#define SRC_BRINGUP_BIN_NETSVC_NETCP_H_

#include <sys/types.h>
#include <zircon/types.h>

#include <optional>

int netcp_open(const char* filename, uint32_t arg, size_t* file_size);

ssize_t netcp_offset_read(void* data_out, off_t offset, size_t max_len);

ssize_t netcp_read(void* data_out, size_t data_sz);

ssize_t netcp_offset_write(const char* data, off_t offset, size_t length);

ssize_t netcp_write(const char* data, size_t len);

int netcp_close();

void netcp_abort_write();

namespace netsvc {

class NetCopyInterface {
 public:
  virtual ~NetCopyInterface() {}
  virtual int Open(const char* filename, uint32_t arg, size_t* file_size) = 0;
  virtual ssize_t Read(void* data_out, std::optional<off_t> offset, size_t max_len) = 0;
  virtual ssize_t Write(const char* data, std::optional<off_t> offset, size_t length) = 0;
  virtual int Close() = 0;
  virtual void AbortWrite() = 0;
};

class NetCopy : public NetCopyInterface {
 public:
  explicit NetCopy() {}

  int Open(const char* filename, uint32_t arg, size_t* file_size) final {
    return netcp_open(filename, arg, file_size);
  }

  ssize_t Read(void* data_out, std::optional<off_t> offset, size_t max_len) final {
    if (offset) {
      return netcp_offset_read(data_out, *offset, max_len);
    } else {
      return netcp_read(data_out, max_len);
    }
  }

  ssize_t Write(const char* data, std::optional<off_t> offset, size_t length) final {
    if (offset) {
      return netcp_offset_write(data, *offset, length);
    } else {
      return netcp_write(data, length);
    }
  }

  int Close() final { return netcp_close(); }

  void AbortWrite() final { netcp_abort_write(); }
};

}  // namespace netsvc

#endif  // SRC_BRINGUP_BIN_NETSVC_NETCP_H_
