// 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_PAYLOAD_STREAMER_H_
#define SRC_BRINGUP_BIN_NETSVC_PAYLOAD_STREAMER_H_

#include <fuchsia/paver/llcpp/fidl.h>
#include <lib/fzl/vmo-mapper.h>
#include <lib/zx/channel.h>
#include <lib/zx/vmo.h>
#include <zircon/types.h>

#include <fbl/function.h>
#include <fbl/unique_fd.h>

namespace netsvc {

// Reads the data into the vmo at offset, size. Can block.
using ReadCallback = fbl::Function<zx_status_t(void* /*buf*/, size_t /*offset*/, size_t /*size*/,
                                               size_t* /*actual*/)>;

class PayloadStreamer : public fidl::WireInterface<fuchsia_paver::PayloadStream> {
 public:
  PayloadStreamer(fidl::ServerEnd<fuchsia_paver::PayloadStream> chan, ReadCallback callback);

  PayloadStreamer(const PayloadStreamer&) = delete;
  PayloadStreamer& operator=(const PayloadStreamer&) = delete;
  PayloadStreamer(PayloadStreamer&&) = delete;
  PayloadStreamer& operator=(PayloadStreamer&&) = delete;

  void RegisterVmo(zx::vmo vmo, RegisterVmoCompleter::Sync& completer);

  void ReadData(ReadDataCompleter::Sync& completer);

 private:
  ReadCallback read_;
  zx::vmo vmo_;
  fzl::VmoMapper mapper_;
  size_t read_offset_ = 0;
  bool eof_reached_ = false;
};

}  // namespace netsvc

#endif  // SRC_BRINGUP_BIN_NETSVC_PAYLOAD_STREAMER_H_
