blob: f4c2b21fe0392f878bfb4b1f9220538349aea93e [file] [log] [blame]
// 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 ZIRCON_SYSTEM_ULIB_PAVER_VMO_READER_H_
#define ZIRCON_SYSTEM_ULIB_PAVER_VMO_READER_H_
#include <fuchsia/mem/llcpp/fidl.h>
#include <lib/zx/vmo.h>
#include <algorithm>
namespace paver {
class VmoReader {
public:
VmoReader(::llcpp::fuchsia::mem::Buffer buffer)
: vmo_(std::move(buffer.vmo)), size_(buffer.size) {}
zx_status_t Read(void* buf, size_t buf_size, size_t* size_actual) {
if (offset_ >= size_) {
return ZX_ERR_OUT_OF_RANGE;
}
const auto size = std::min(size_ - offset_, buf_size);
auto status = vmo_.read(buf, offset_, size);
if (status != ZX_OK) {
return status;
}
offset_ += size;
*size_actual = size;
return ZX_OK;
}
private:
zx::vmo vmo_;
size_t size_;
zx_off_t offset_ = 0;
};
} // namespace paver
#endif // ZIRCON_SYSTEM_ULIB_PAVER_VMO_READER_H_