// Copyright 2022 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_FIRMWARE_LIB_FASTBOOT_PAYLOAD_STREAMER_H_
#define SRC_FIRMWARE_LIB_FASTBOOT_PAYLOAD_STREAMER_H_

#include <fidl/fuchsia.paver/cpp/wire.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/async/default.h>
#include <lib/fidl-async/cpp/bind.h>
#include <lib/fzl/vmo-mapper.h>

namespace fastboot {
namespace internal {

// Implement a PayloadStreamer service for streaming FVM partition required by
// DataSink::WriteVolumes(...).
class PayloadStreamer : public fidl::WireServer<fuchsia_paver::PayloadStream> {
 public:
  PayloadStreamer(fidl::ServerEnd<fuchsia_paver::PayloadStream> server_end, const void* data,
                  size_t size)
      : data_(static_cast<const uint8_t*>(data)), size_(size) {
    fidl::BindSingleInFlightOnly(async_get_default_dispatcher(), std::move(server_end), this);
  }

  ~PayloadStreamer() override = default;

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

  // Register a vmo for reading data from the payload
  void RegisterVmo(RegisterVmoRequestView request, RegisterVmoCompleter::Sync& completer) override;

  // Read the payload data into the vmo registered via RegisterVmo(...)
  void ReadData(ReadDataRequestView request, ReadDataCompleter::Sync& completer) override;

 private:
  zx::vmo vmo_;
  fzl::VmoMapper mapper_;
  const uint8_t* data_ = nullptr;
  size_t size_ = 0;
  size_t read_offset_ = 0;
  bool eof_reached_ = false;
};

}  // namespace internal
}  // namespace fastboot

#endif  // SRC_FIRMWARE_LIB_FASTBOOT_PAYLOAD_STREAMER_H_
